{"_id":"@dugleelabs/strapi-mcp-server","_rev":"3-5c27d99321ed20ecfc3ac4ad842d48a6","name":"@dugleelabs/strapi-mcp-server","dist-tags":{"latest":"1.3.0"},"versions":{"0.1.0":{"name":"@dugleelabs/strapi-mcp-server","version":"0.1.0","license":"MIT","_id":"@dugleelabs/strapi-mcp-server@0.1.0","maintainers":[{"name":"sharma02gaurav","email":"sharma02gaurav@gmail.com"}],"bin":{"strapi-mcp-server":"dist/index.js"},"dist":{"shasum":"2f522ac31946b0c9e5bcbcff8fb8b4696bc2392f","tarball":"https://registry.npmjs.org/@dugleelabs/strapi-mcp-server/-/strapi-mcp-server-0.1.0.tgz","fileCount":12,"integrity":"sha512-ZDbMEPX3akpoXOQ3CjfvDgah/BEXEscBCWY0Xlbtb+Mi/hXPNG9Ut1d/z2h0rQjBzW/J35vz3eNs0l7swz7ymQ==","signatures":[{"sig":"MEUCIQDgwgwC+eHzZ+AzdNwN/9KlnCalYsmvThPHmR0UBGZTGAIgcLVfhH1BPA3dw5mFekFYsO3rVhI7KwB3Y4p7rhVogE0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52384},"main":"./dist/index.js","type":"module","_from":"file:dugleelabs-strapi-mcp-server-0.1.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"scripts":{"dev":"tsx watch src/index.ts","lint":"biome check","test":"vitest","build":"tsup","start":"node dist/index.js","format":"biome format --write","test:coverage":"vitest --coverage"},"_npmUser":{"name":"sharma02gaurav","email":"sharma02gaurav@gmail.com"},"_resolved":"/tmp/e7202ac470efa91032e5db8629cd3faf/dugleelabs-strapi-mcp-server-0.1.0.tgz","_integrity":"sha512-ZDbMEPX3akpoXOQ3CjfvDgah/BEXEscBCWY0Xlbtb+Mi/hXPNG9Ut1d/z2h0rQjBzW/J35vz3eNs0l7swz7ymQ==","_npmVersion":"10.8.2","description":"A general-purpose, open-source MCP server for Strapi v4. Exposes Strapi CRUD and schema introspection as MCP tools, with optional AI content generation (research + draft) via the Vercel AI SDK and configurable web search providers. Use it with Claude Desk","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^3.0.0","zod-to-json-schema":"^3.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.0.0","tsx":"^4.0.0","tsup":"^8.0.0","vitest":"^3.0.0","typescript":"^5.0.0","@types/node":"^25.3.3","@biomejs/biome":"^1.0.0","@vitest/coverage-v8":"^3.0.0"},"peerDependencies":{"ai":"^4.0.0","@ai-sdk/google":"^1.0.0","@ai-sdk/openai":"^1.0.0","@ai-sdk/mistral":"^1.0.0","@ai-sdk/anthropic":"^1.0.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@ai-sdk/mistral":{"optional":true},"@ai-sdk/anthropic":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/strapi-mcp-server_0.1.0_1772814629145_0.9652511409083708","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@dugleelabs/strapi-mcp-server","version":"1.2.0","license":"MIT","_id":"@dugleelabs/strapi-mcp-server@1.2.0","maintainers":[{"name":"sharma02gaurav","email":"sharma02gaurav@gmail.com"}],"bin":{"strapi-mcp-server":"dist/index.js"},"dist":{"shasum":"147dcab7674c9aaf047eb6a5eb57ed3614e8b582","tarball":"https://registry.npmjs.org/@dugleelabs/strapi-mcp-server/-/strapi-mcp-server-1.2.0.tgz","fileCount":12,"integrity":"sha512-x9ir0fAFJCBEAzZqd19kdUOXZvjrA/02mXwtb9zl3gJEQvZR9on7TwUVlZbegyAVMeFF2s9AryDvCx9SdmJ3sA==","signatures":[{"sig":"MEQCIB/DA9JsQl0vyViotBSQHDRe1NR8w3N0HM3QLYut2NrlAiAqDp57aEyLMR7bL4H/Po6Kn3EJRElrxnkA05DE8C2DXQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":53027},"main":"./dist/index.js","type":"module","_from":"file:dugleelabs-strapi-mcp-server-1.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"scripts":{"dev":"tsx watch src/index.ts","lint":"biome check","test":"vitest","build":"tsup","start":"node dist/index.js","format":"biome format --write","test:coverage":"vitest --coverage"},"_npmUser":{"name":"sharma02gaurav","email":"sharma02gaurav@gmail.com"},"_resolved":"/tmp/ae518543eb40b251f3621f10576197b2/dugleelabs-strapi-mcp-server-1.2.0.tgz","_integrity":"sha512-x9ir0fAFJCBEAzZqd19kdUOXZvjrA/02mXwtb9zl3gJEQvZR9on7TwUVlZbegyAVMeFF2s9AryDvCx9SdmJ3sA==","_npmVersion":"10.8.2","description":"[![PR Validation](https://github.com/dugleelabs/strapi-mcp-server/actions/workflows/pull_request.yaml/badge.svg)](https://github.com/dugleelabs/strapi-mcp-server/actions/workflows/pull_request.yaml) [![Semantic Release](https://github.com/dugleelabs/strap","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^3.0.0","zod-to-json-schema":"^3.0.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.0.0","tsx":"^4.0.0","tsup":"^8.0.0","husky":"^9.1.7","vitest":"^3.0.0","typescript":"^5.0.0","@types/node":"^25.3.3","@biomejs/biome":"^1.0.0","@vitest/coverage-v8":"^3.0.0"},"peerDependencies":{"ai":"^4.0.0","@ai-sdk/google":"^1.0.0","@ai-sdk/openai":"^1.0.0","@ai-sdk/mistral":"^1.0.0","@ai-sdk/anthropic":"^1.0.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@ai-sdk/mistral":{"optional":true},"@ai-sdk/anthropic":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/strapi-mcp-server_1.2.0_1772816027421_0.07491206964848862","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@dugleelabs/strapi-mcp-server","version":"1.3.0","license":"MIT","type":"module","engines":{"node":">=20"},"bin":{"strapi-mcp-server":"dist/index.js"},"main":"./dist/index.js","dependencies":{"@modelcontextprotocol/sdk":"^1.0.0","zod":"^3.0.0","zod-to-json-schema":"^3.0.0"},"peerDependencies":{"@ai-sdk/anthropic":"^1.0.0","@ai-sdk/google":"^1.0.0","@ai-sdk/mistral":"^1.0.0","@ai-sdk/openai":"^1.0.0","ai":"^4.0.0"},"peerDependenciesMeta":{"ai":{"optional":true},"@ai-sdk/openai":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@ai-sdk/google":{"optional":true},"@ai-sdk/mistral":{"optional":true}},"devDependencies":{"@biomejs/biome":"^1.0.0","@types/node":"^25.3.3","@vitest/coverage-v8":"^3.0.0","husky":"^9.1.7","msw":"^2.0.0","tsup":"^8.0.0","tsx":"^4.0.0","typescript":"^5.0.0","vitest":"^3.0.0"},"scripts":{"dev":"tsx watch src/index.ts","build":"tsup","start":"node dist/index.js","test":"vitest","test:coverage":"vitest --coverage","lint":"biome check","format":"biome format --write"},"_id":"@dugleelabs/strapi-mcp-server@1.3.0","types":"./dist/index.d.ts","description":"[![PR Validation](https://github.com/dugleelabs/strapi-mcp-server/actions/workflows/pull_request.yaml/badge.svg)](https://github.com/dugleelabs/strapi-mcp-server/actions/workflows/pull_request.yaml) [![Semantic Release](https://github.com/dugleelabs/strap","_integrity":"sha512-23mBQOkNJy/h9lB1WzjBDRfwV5JUZFLsu4pvp4WFY8FCFFpXdTCwEzGmdiFttxxeQcjwxZyTiQ6MZLp9xQsGkw==","_resolved":"/tmp/d444b89f5a079711e9bcf62bef4946c5/dugleelabs-strapi-mcp-server-1.3.0.tgz","_from":"file:dugleelabs-strapi-mcp-server-1.3.0.tgz","_nodeVersion":"20.20.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-23mBQOkNJy/h9lB1WzjBDRfwV5JUZFLsu4pvp4WFY8FCFFpXdTCwEzGmdiFttxxeQcjwxZyTiQ6MZLp9xQsGkw==","shasum":"55216d4152d4fb73f2b5e07fdb5a70d9bde88556","tarball":"https://registry.npmjs.org/@dugleelabs/strapi-mcp-server/-/strapi-mcp-server-1.3.0.tgz","fileCount":12,"unpackedSize":53052,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFO+AioEzbtlqF7rROFt1KwEDLqV8OLuqIhYUibPixUMAiBuWUoHPOCU16GlXiLJqhv4QNu5adovMCHm1wkCusC16w=="}]},"_npmUser":{"name":"sharma02gaurav","email":"sharma02gaurav@gmail.com"},"directories":{},"maintainers":[{"name":"sharma02gaurav","email":"sharma02gaurav@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/strapi-mcp-server_1.3.0_1772818489539_0.6889462627490108"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-06T16:30:29.064Z","modified":"2026-03-06T17:34:49.824Z","0.1.0":"2026-03-06T16:30:29.279Z","1.2.0":"2026-03-06T16:53:47.565Z","1.3.0":"2026-03-06T17:34:49.686Z"},"license":"MIT","description":"[![PR Validation](https://github.com/dugleelabs/strapi-mcp-server/actions/workflows/pull_request.yaml/badge.svg)](https://github.com/dugleelabs/strapi-mcp-server/actions/workflows/pull_request.yaml) [![Semantic Release](https://github.com/dugleelabs/strap","maintainers":[{"name":"sharma02gaurav","email":"sharma02gaurav@gmail.com"}],"readme":"# @dugleelabs/strapi-mcp-server\n\n[![PR Validation](https://github.com/dugleelabs/strapi-mcp-server/actions/workflows/pull_request.yaml/badge.svg)](https://github.com/dugleelabs/strapi-mcp-server/actions/workflows/pull_request.yaml)\n[![Semantic Release](https://github.com/dugleelabs/strapi-mcp-server/actions/workflows/release.yaml/badge.svg)](https://github.com/dugleelabs/strapi-mcp-server/actions/workflows/release.yaml)\n[![GitHub Release](https://img.shields.io/github/v/release/dugleelabs/strapi-mcp-server)](https://github.com/dugleelabs/strapi-mcp-server/releases/latest)\n\nA general-purpose, open-source MCP server for Strapi v4. Exposes Strapi CRUD and schema introspection as MCP tools, with optional AI content generation (research + draft) via the Vercel AI SDK and configurable web search providers. Use it with Claude Desktop, Cursor, or any MCP-compatible agent to manage content through natural language — or automate content creation pipelines entirely.\n\n---\n\n## Prerequisites\n\n- Node.js 20+\n- pnpm (or npm/npx)\n- A running Strapi v4 instance with an API token\n\n---\n\n## Quick Start\n\nCopy the env vars and run with `pnpm dlx`:\n\n```bash\nSTRAPI_URL=http://localhost:1337 \\\nSTRAPI_API_TOKEN=your-token-here \\\npnpm dlx @dugleelabs/strapi-mcp-server\n```\n\nThe server starts over stdio and is ready to use immediately. All configuration is via environment variables — no install step required.\n\n---\n\n## Claude Desktop Configuration\n\nAdd this to your `claude_desktop_config.json` (usually at `~/Library/Application Support/Claude/claude_desktop_config.json`):\n\n```json\n{\n  \"mcpServers\": {\n    \"strapi\": {\n      \"command\": \"pnpm\",\n      \"args\": [\"dlx\", \"@dugleelabs/strapi-mcp-server\"],\n      \"env\": {\n        \"STRAPI_URL\": \"http://localhost:1337\",\n        \"STRAPI_API_TOKEN\": \"your-token-here\",\n        \"AI_PROVIDER\": \"anthropic\",\n        \"AI_MODEL\": \"claude-sonnet-4-6\",\n        \"ANTHROPIC_API_KEY\": \"sk-ant-...\",\n        \"SEARCH_PROVIDER\": \"tavily\",\n        \"TAVILY_API_KEY\": \"tvly-...\"\n      }\n    }\n  }\n}\n```\n\n---\n\n## Environment Variables\n\n| Variable | Required | Description | Example |\n|---|---|---|---|\n| `STRAPI_URL` | **Yes** | Base URL of your Strapi instance | `http://localhost:1337` |\n| `STRAPI_API_TOKEN` | **Yes** | Strapi API token (Full Access or scoped) | `abc123...` |\n| `SEARCH_PROVIDER` | No | Enables `research_topic`: `tavily`, `brave`, or `exa` | `tavily` |\n| `TAVILY_API_KEY` | If `SEARCH_PROVIDER=tavily` | Tavily API key | `tvly-...` |\n| `BRAVE_API_KEY` | If `SEARCH_PROVIDER=brave` | Brave Search API key | `BSA...` |\n| `EXA_API_KEY` | If `SEARCH_PROVIDER=exa` | Exa API key | `exa-...` |\n| `AI_PROVIDER` | No | Enables AI tools: `openai`, `anthropic`, `google`, `mistral`, `ollama` | `anthropic` |\n| `AI_MODEL` | If `AI_PROVIDER` set | Model name for the selected provider | `claude-sonnet-4-6` |\n| `ANTHROPIC_API_KEY` | If `AI_PROVIDER=anthropic` | Anthropic API key | `sk-ant-...` |\n| `OPENAI_API_KEY` | If `AI_PROVIDER=openai` | OpenAI API key | `sk-...` |\n| `GOOGLE_GENERATIVE_AI_API_KEY` | If `AI_PROVIDER=google` | Google AI API key | `AIza...` |\n| `MISTRAL_API_KEY` | If `AI_PROVIDER=mistral` | Mistral API key | `...` |\n| `OLLAMA_BASE_URL` | If `AI_PROVIDER=ollama` | Ollama base URL | `http://localhost:11434` |\n\n---\n\n## Tools\n\n### Tier 1 — CRUD (always enabled)\n\n#### `list_entries`\nList entries from a Strapi content type.\n\n```json\n{\n  \"contentType\": \"articles\",\n  \"page\": 1,\n  \"pageSize\": 25,\n  \"status\": \"draft\",\n  \"filters\": { \"title\": { \"$contains\": \"AI\" } }\n}\n```\n\nReturns: `{ entries, total, page, pageCount }`\n\n---\n\n#### `get_entry`\nFetch a single entry by ID.\n\n```json\n{ \"contentType\": \"articles\", \"id\": 42 }\n```\n\nReturns: `{ entry }`\n\n---\n\n#### `create_entry`\nCreate a new entry. Use `get_content_type_schema` first to see available fields.\n\n```json\n{\n  \"contentType\": \"articles\",\n  \"data\": { \"title\": \"My Post\", \"content\": \"...\" },\n  \"publish\": false\n}\n```\n\nReturns: `{ id, adminUrl, entry }`\n\n---\n\n#### `update_entry`\nPartially update an existing entry.\n\n```json\n{\n  \"contentType\": \"articles\",\n  \"id\": 42,\n  \"data\": { \"title\": \"Updated Title\" }\n}\n```\n\nReturns: `{ id, entry }`\n\n---\n\n#### `delete_entry`\nPermanently delete an entry.\n\n```json\n{ \"contentType\": \"articles\", \"id\": 42 }\n```\n\nReturns: `{ success: true, message: \"Entry 42 deleted from articles\" }`\n\n---\n\n#### `list_content_types`\nList all content types in the Strapi instance. Use this to discover available types before CRUD operations.\n\nNo input required.\n\nReturns: `{ contentTypes: [{ uid, displayName, pluralName, kind }] }`\n\n---\n\n#### `get_content_type_schema`\nGet the field schema for a content type — field names, types, and required status.\n\n```json\n{ \"uid\": \"api::article.article\" }\n```\n\nReturns: `{ uid, displayName, attributes: { [field]: { type, required, default } } }`\n\n---\n\n### Tier 2 — Search (requires `SEARCH_PROVIDER`)\n\n#### `research_topic`\nSearch the web for current information on a topic.\n\n```json\n{\n  \"topic\": \"TypeScript 2026 trends\",\n  \"context\": \"developer tooling\",\n  \"maxResults\": 10\n}\n```\n\nReturns: `{ query, results: [{ title, url, content, score }], provider }`\n\n---\n\n### Tier 3 — AI Content (requires `AI_PROVIDER`)\n\n#### `generate_draft`\nGenerate a structured blog post draft using the configured AI provider.\n\n```json\n{\n  \"topic\": \"TypeScript 2026 trends\",\n  \"researchResults\": [...],\n  \"styleGuide\": \"Write tersely for senior engineers.\",\n  \"targetWordCount\": 800\n}\n```\n\nReturns: `{ title, body, metaDescription, tags, wordCount }`\n\n---\n\n#### `create_content_from_research`\nEnd-to-end: research a topic → generate a draft → save to Strapi. Requires both search and AI configured.\n\n```json\n{\n  \"topic\": \"TypeScript 2026 trends\",\n  \"contentType\": \"articles\",\n  \"context\": \"focus on tooling and DX\",\n  \"styleGuide\": \"Terse, developer-focused.\",\n  \"fieldMapping\": {\n    \"title\": \"title\",\n    \"body\": \"content\",\n    \"metaDescription\": \"seo_description\",\n    \"tags\": \"tags\"\n  }\n}\n```\n\n> **Note on `fieldMapping`:** Every Strapi instance has different field names. Provide `fieldMapping` to match your content type's actual fields. If omitted, draft keys are used as-is (`title`, `body`, `metaDescription`, `tags`).\n\nReturns: `{ strapiId, adminUrl, title, wordCount, step }`\n\n---\n\n## MCP Prompts\n\nThree prompts are registered as slash commands in MCP clients:\n\n| Prompt | Arguments | Description |\n|---|---|---|\n| `dugleelabs/create-blog-from-topic` | `topic` (required), `contentType` (optional) | Research a topic and create a draft blog post in Strapi |\n| `dugleelabs/list-drafts` | `contentType` (required) | Show all unpublished drafts for a content type |\n| `dugleelabs/review-entry` | `contentType`, `id` (both required) | Fetch an entry and suggest improvements before publishing |\n\n---\n\n## Search Providers\n\n### Tavily\n```bash\nSEARCH_PROVIDER=tavily TAVILY_API_KEY=tvly-...\n```\nGet an API key at [tavily.com](https://tavily.com).\n\n### Brave Search\n```bash\nSEARCH_PROVIDER=brave BRAVE_API_KEY=BSA...\n```\nGet an API key at [brave.com/search/api](https://brave.com/search/api).\n\n### Exa\n```bash\nSEARCH_PROVIDER=exa EXA_API_KEY=exa-...\n```\nGet an API key at [exa.ai](https://exa.ai).\n\n---\n\n## AI Providers\n\nInstall only the provider package you need:\n\n### Anthropic (Claude)\n```bash\npnpm add @ai-sdk/anthropic\nAI_PROVIDER=anthropic AI_MODEL=claude-sonnet-4-6 ANTHROPIC_API_KEY=sk-ant-...\n```\n\n### OpenAI\n```bash\npnpm add @ai-sdk/openai\nAI_PROVIDER=openai AI_MODEL=gpt-4o OPENAI_API_KEY=sk-...\n```\n\n### Google\n```bash\npnpm add @ai-sdk/google\nAI_PROVIDER=google AI_MODEL=gemini-1.5-pro GOOGLE_GENERATIVE_AI_API_KEY=AIza...\n```\n\n### Mistral\n```bash\npnpm add @ai-sdk/mistral\nAI_PROVIDER=mistral AI_MODEL=mistral-large-latest MISTRAL_API_KEY=...\n```\n\n### Ollama (local)\n```bash\npnpm add @ai-sdk/openai\nAI_PROVIDER=ollama AI_MODEL=llama3 OLLAMA_BASE_URL=http://localhost:11434\n```\n\n---\n\n## Known Limitations\n\n- **Schema introspection requires Full Access token:** The `list_content_types` and `get_content_type_schema` tools use Strapi's content-type-builder API, which may return 403 with restricted tokens. CRUD tools work with any scoped token that has the appropriate permissions.\n\n- **`pnpm dlx` latency:** Running via `pnpm dlx` downloads the package on every invocation, which adds ~2–5 seconds of startup latency in Claude Desktop. To avoid this, install globally: `pnpm add -g @dugleelabs/strapi-mcp-server`.\n\n- **Strapi v4 only:** Targets the Strapi v4 REST API. Strapi v5 support is planned.\n\n- **No content type assumptions:** The server does not assume any specific field names. Always use `get_content_type_schema` or provide `fieldMapping` to match your Strapi schema.\n\n---\n\n## Contributing\n\nIssues and PRs welcome at [github.com/dugleelabs/strapi-mcp-server](https://github.com/dugleelabs/strapi-mcp-server).\n\n```bash\ngit clone git@github.com:dugleelabs/strapi-mcp-server.git\ncd strapi-mcp-server\npnpm install\ncp .env.example .env  # fill in STRAPI_URL and STRAPI_API_TOKEN\npnpm test\npnpm build\n```\n\nUse [MCP Inspector](https://github.com/modelcontextprotocol/inspector) for interactive local testing:\n\n```bash\npnpm dlx @modelcontextprotocol/inspector pnpm start\n```\n\n---\n\n## License\n\nMIT — see [LICENSE](./LICENSE).\n","readmeFilename":"README.md"}