{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_hkcjshpka6d6","handle":"ckanext-mcp","url":"https://wellknown.network/agents/ckanext-mcp","links":{"self":"https://wellknown.network/agents/ckanext-mcp/record.json","html":"https://wellknown.network/agents/ckanext-mcp","markdown":"https://wellknown.network/agents/ckanext-mcp/record.md","api":"https://wellknown.network/api/v1/agents/ckanext-mcp","status":"https://wellknown.network/api/v1/agents/ckanext-mcp/status","claim":"https://wellknown.network/agents/ckanext-mcp/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/ckanext-mcp/claim.json","badge":"https://wellknown.network/agents/ckanext-mcp/badge.svg","openapi":"https://wellknown.network/openapi.json"},"ard":{"identifier":"urn:air::server:ckanext-mcp","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"ckanext-mcp","summary":"CKAN extension that exposes all available CKAN API actions as MCP tools via a Flask blueprint","description":"# ckanext-mcp\n\nMCP bridge for CKAN — exposes all API actions from CKAN core and installed extensions as MCP tools. LLMs act as the authenticated user, inheriting all CKAN permissions.\n\n## How it works\n\nCKAN installations have ~200 API actions depending on installed extensions. Exposing all of them as flat MCP tools would overwhelm any LLM. Instead, ckanext-mcp builds **~25 synthetic entity tools** at startup:\n\n- **`ckan_package`** — show, list, create, update, delete, patch, search\n- **`ckan_resource`** — show, create, update, delete, patch, search\n- **`ckan_organization`** — show, list, create, update, delete, patch\n- **`ckan_tag`** — show, list, create, delete, search\n- **`ckan_search_tools`** — discover any of the ~200 actions by keyword, entity, or source\n- ... and more, derived automatically from installed plugins\n\nEach entity tool bundles CRUD operations. The LLM passes an `operation` parameter to select the action:\n\n```json\n{\n  \"name\": \"ckan_package\",\n  \"arguments\": {\n    \"operation\": \"show\",\n    \"id\": \"my-dataset\"\n  }\n}\n```\n\n**Zero hardcoding** — entity grouping derived from CKAN's naming convention (`package_show` → entity `package`), source from `IActions` plugin registry, read/write from `side_effect_free` attribute.\n\n## Installation\n\n```bash\npip install ckanext-mcp\n```\n\nAdd `mcp` to `ckan.plugins` in your ckan.ini or `.env`:\n\n```\nckan.plugins = ... mcp\n```\n\n## Configuration\n\n| Option | Default | Description |\n|--------|---------|-------------|\n| `ckanext.mcp.categories` | *(empty)* | Comma-separated entity or source filter (e.g. `package,resource,harvest`) |\n\nThe MCP endpoint is always available at `/mcp`.\n\n## Client Setup\n\nGenerate a `.mcp.json` config for your MCP client:\n\n```bash\nckan -c ckan.ini mcp init\n```\n\nThis creates `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"ckan\": {\n      \"type\": \"http\",\n      \"url\": \"https://your-ckan.example.com/mcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer <YOUR_API_KEY>\"\n      }\n    }\n  }\n}\n```\n\nReplace `<…","publisher":null,"homepage":"https://github.com/Mat-O-Lab/ckanext-mcp","repository":"https://github.com/Mat-O-Lab/ckanext-mcp","version":"0.1.0","license":"AGPL","protocols":["mcp"],"tags":["ckan","mcp","model","context","protocol","ai","llm","api","bridge"],"pricing":null,"endpoints":[{"url":"pypi:ckanext-mcp","type":"package_pypi","auth":null,"probeable":false}],"skills":null,"tools":null,"extra":null,"attribution":{"kind":"pypi","name":"pypi","license":"pypi","repoUrl":"pypi","summary":"pypi","version":"pypi","description":"pypi","homepageUrl":"pypi"}},"derived":{"capabilities":[{"slug":"security.identity","name":"Identity & Access","confidence":0.905,"provenance":"derived"}],"categories":["security"],"language":"en"},"observed":{"status":"unknown","statusReason":"Distributed as a package to run locally; no network endpoint to check.","lastOkAt":null,"lastProbedAt":null,"statusComputedAt":null,"reliability30d":null,"latestObservations":[],"tools":null,"package":{"name":"ckanext-mcp","registry":"pypi","observedAt":"2026-09-09T11:34:52.864Z","publishedAt":"2026-07-28T15:26:13.813401Z","latestVersion":"0.1.0"}},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"pypi","key":"ckanext-mcp","url":"https://pypi.org/project/ckanext-mcp/","firstSeenAt":"2026-09-09T11:30:43.858Z","fetchedAt":"2026-09-09T11:30:43.858Z","normalizedAt":"2026-09-09T11:30:43.858Z"}]},"firstSeenAt":"2026-09-09T11:30:43.858Z","updatedAt":"2026-09-09T11:34:52.864Z"}