{
  "markdown": "# Notra MCP Server\n\nAn MCP (Model Context Protocol) server for the [Notra API](https://docs.usenotra.com). It manages posts, brand identities, integrations, schedules, GEO visibility scans, competitors, content briefs, and AI traffic analytics.\n\n## Setup\n\nYou can generate an API key from your [Notra workspace dashboard](https://app.usenotra.com) under Developer > API Keys.\n\nNode.js 20 or newer is required.\n\n### Claude Desktop\n\nAdd to `~/Library/Application Support/Claude/claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"notra\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@usenotra/mcp\"],\n      \"env\": {\n        \"NOTRA_API_KEY\": \"your-api-key\"\n      }\n    }\n  }\n}\n```\n\n### Claude Code\n\n```bash\nclaude mcp add notra -- npx -y @usenotra/mcp\n```\n\nThen set the `NOTRA_API_KEY` environment variable in your shell before launching Claude Code.\n\n### Codex\n\n```bash\nexport NOTRA_API_KEY=your-api-key\ncodex mcp add notra --env NOTRA_API_KEY=\"$NOTRA_API_KEY\" -- npx -y @usenotra/mcp\n```\n\nRun `codex mcp list` to verify the connection. The Codex CLI, desktop app, and IDE extension share this MCP configuration.\n\n### OpenCode\n\nSet `NOTRA_API_KEY` in your shell, then add the server to your project-level `opencode.json` or the global `~/.config/opencode/opencode.json`:\n\n```json\n{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"mcp\": {\n    \"notra\": {\n      \"type\": \"local\",\n      \"command\": [\"npx\", \"-y\", \"@usenotra/mcp\"],\n      \"enabled\": true,\n      \"environment\": {\n        \"NOTRA_API_KEY\": \"{env:NOTRA_API_KEY}\"\n      }\n    }\n  }\n}\n```\n\n### Amp\n\nRun `amp config edit` and add the following to your settings, or place it in `.amp/settings.json` for a workspace-specific configuration:\n\n```json\n{\n  \"amp.mcpServers\": {\n    \"notra\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@usenotra/mcp\"],\n      \"env\": {\n        \"NOTRA_API_KEY\": \"${NOTRA_API_KEY}\"\n      }\n    }\n  }\n}\n```\n\nSet `NOTRA_API_KEY` in the environment before launching Amp. Workspace MCP servers may require approval with `amp mcp approve notra`.\n\n## Remote MCP (OAuth)\n\nThe hosted streamable HTTP server at `https://mcp.usenotra.com/mcp` uses OAuth as the primary authentication method. It supports the current `2026-07-28` MCP protocol as well as legacy 2025 clients. MCP clients should discover protected resource metadata at:\n\n```text\nhttps://mcp.usenotra.com/.well-known/oauth-protected-resource\n```\n\nThat metadata points to the Notra authorization server (WorkOS AuthKit) at `https://oauth.usenotra.com`, which supports dynamic client registration (RFC 7591). The MCP server also mirrors the authorization server metadata at `https://mcp.usenotra.com/.well-known/oauth-authorization-server`.\n\n### API key alternative\n\nRemote connections also accept a Notra API key as a static `Authorization: Bearer …` header. Generate one from your [Notra workspace dashboard](https://app.usenotra.com) under Developer > API Keys. OAuth-capable clients should prefer the OAuth flow instead of manual key configuration.\n\nFor self-hosted HTTP deployments, OAuth validation can be configured with:\n\n```bash\nWORKOS_AUTHKIT_DOMAIN=oauth.usenotra.com\nWORKOS_CLIENT_ID=client_xxx\nNOTRA_MCP_RESOURCE=https://mcp.usenotra.com\n```\n\nThe issuer is `https://{WORKOS_AUTHKIT_DOMAIN}` and must match the `iss` claim in tokens minted by AuthKit; a mismatch causes every bearer token to be rejected. Token signatures are verified against `https://{WORKOS_AUTHKIT_DOMAIN}/oauth2/jwks`.\n\nWhen `NODE_ENV=development`, the default AuthKit domain is `essential-berry-67-development-2.authkit.app`; production defaults to `oauth.usenotra.com`. `auth.usenotra.com` is the WorkOS Authentication API domain and serves none of the OAuth endpoints, so it does not work here.\n\n## Tools\n\n### Posts\n\n| Tool                         | Description                                                                                        |\n| ---------------------------- | -------------------------------------------------------------------------------------------------- |\n| `list_posts`                 | List posts with optional filters for sorting, pagination, status, content type, and brand identity |\n| `get_post`                   | Get a single post by ID                                                                            |\n| `update_post`                | Update a post's title, markdown, or status                                                         |\n| `delete_post`                | Delete a post                                                                                      |\n| `generate_post`              | Queue async post generation from GitHub activity                                                   |\n| `get_post_generation_status` | Check the status of a post generation job                                                          |\n\n### Brand Identities\n\n| Tool                                   | Description                                              |\n| -------------------------------------- | -------------------------------------------------------- |\n| `list_brand_identities`                | List all brand identities                                |\n| `get_brand_identity`                   | Get a single brand identity by ID                        |\n| `update_brand_identity`                | Update brand identity settings                           |\n| `delete_brand_identity`                | Delete a brand identity                                  |\n| `generate_brand_identity`              | Queue async brand identity generation from a website URL |\n| `get_brand_identity_generation_status` | Check the status of a brand identity generation job      |\n\n### Integrations\n\n| Tool                        | Description                                             |\n| --------------------------- | ------------------------------------------------------- |\n| `list_integrations`         | List all connected integrations (GitHub, Slack, Linear) |\n| `create_github_integration` | Connect a GitHub repository                             |\n| `delete_integration`        | Delete a GitHub or Linear integration                   |\n\n### Schedules\n\n| Tool              | Description                               |\n| ----------------- | ----------------------------------------- |\n| `list_schedules`  | List scheduled content generation jobs    |\n| `create_schedule` | Create a scheduled content generation job |\n| `update_schedule` | Update a scheduled content generation job |\n| `delete_schedule` | Delete a scheduled content generation job |\n\n### Chats\n\n| Tool                           | Description                                                      |\n| ------------------------------ | ---------------------------------------------------------------- |\n| `list_chats`                   | List chat sessions                                               |\n| `get_chat`                     | Get a single chat with messages                                  |\n| `get_chat_by_external_channel` | Get a chat by Discord or Slack channel ID                        |\n| `create_chat`                  | Start a new chat and return the streamed reply                   |\n| `post_chat_message`            | Post a message to an existing chat and return the streamed reply |\n\n### Skills\n\n| Tool           | Description                     |\n| -------------- | ------------------------------- |\n| `list_skills`  | List reusable writing skills    |\n| `get_skill`    | Get a single skill by name      |\n| `create_skill` | Create a reusable writing skill |\n| `update_skill` | Update a reusable writing skill |\n| `delete_skill` | Delete a reusable writing skill |\n\n### Projects\n\nGEO features are scoped to a project. Most GEO tools take a `projectId`; call `list_projects` first to find it. GEO tools require an organization-scoped API key and the GEO plan.\n\n| Tool             | Description                                          |\n| ---------------- | ---------------------------------------------------- |\n| `list_projects`  | List the organization's GEO projects                 |\n| `get_project`    | Get a single project by ID                           |\n| `create_project` | Create a project, optionally linked to a brand       |\n| `update_project` | Rename a project or relink its brand identity        |\n| `delete_project` | Delete a project and all of its GEO data (cascading) |\n\n### GEO settings\n\n| Tool                  | Description                                                      |\n| --------------------- | ---------------------------------------------------------------- |\n| `get_geo_settings`    | Get tracked company, aliases, languages, engines and scan config |\n| `update_geo_settings` | Replace the settings document and restart the scan cycle         |\n\n### GEO prompts and sequences\n\n| Tool                  | Description                                                           |\n| --------------------- | --------------------------------------------------------------------- |\n| `list_geo_prompts`    | List tracked prompts (custom and auto-derived)                        |\n| `create_geo_prompt`   | Track a new prompt                                                    |\n| `update_geo_prompt`   | Enable or disable a tracked prompt                                    |\n| `delete_geo_prompt`   | Stop tracking a prompt                                                |\n| `import_geo_prompts`  | Bulk import prompts from rows or CSV                                  |\n| `list_geo_sequences`  | List multi-turn prompt sequences                                      |\n| `create_geo_sequence` | Create a prompt sequence                                              |\n| `update_geo_sequence` | Update a sequence's name, steps or enabled state                      |\n| `delete_geo_sequence` | Delete a sequence                                                     |\n| `run_geo_sequence`    | Run a sequence now, synchronously (uses AI credits, can take minutes) |\n\n### GEO competitors\n\n| Tool                      | Description                                 |\n| ------------------------- | ------------------------------------------- |\n| `list_geo_competitors`    | List tracked competitors                    |\n| `upsert_geo_competitor`   | Create, update or rename a competitor       |\n| `suggest_geo_competitors` | AI-discover likely competitors for a domain |\n| `delete_geo_competitor`   | Stop tracking a competitor                  |\n| `import_geo_competitors`  | Bulk import competitors from rows or CSV    |\n\n### GEO scans and visibility\n\n| Tool                            | Description                                                 |\n| ------------------------------- | ----------------------------------------------------------- |\n| `create_geo_scan`               | Trigger an async visibility scan (uses AI credits)          |\n| `list_geo_scans`                | List scans with pagination                                  |\n| `get_geo_scan`                  | Get a scan and its status                                   |\n| `get_geo_visibility_overview`   | Mention rates per answer engine                             |\n| `get_geo_visibility_timeseries` | Daily mention counts per engine                             |\n| `get_geo_prompt_results`        | Latest stored answer per prompt and engine, with sources    |\n| `get_geo_competitor_share`      | Share of voice across tracked brands                        |\n| `get_geo_language_share`        | Mention rates per tracked language                          |\n| `get_geo_competitor_detail`     | One competitor's mention history and the prompts driving it |\n\n### GEO content briefs\n\n| Tool                        | Description                                                   |\n| --------------------------- | ------------------------------------------------------------- |\n| `list_geo_content_gaps`     | Prompts where competitors are mentioned and this brand is not |\n| `list_geo_content_briefs`   | List content briefs and their statuses                        |\n| `plan_geo_content_brief`    | Research a topic and plan a brief (billed, can take minutes)  |\n| `get_geo_content_brief`     | Get a brief with the full document and writer status          |\n| `approve_geo_content_brief` | Approve a brief and start the article writer                  |\n\n### Agent readiness\n\n| Tool                             | Description                                                   |\n| -------------------------------- | ------------------------------------------------------------- |\n| `get_geo_agent_readiness`        | Latest readiness report, score history and any scan in flight |\n| `start_geo_agent_readiness_scan` | Queue a readiness scan of the project's website               |\n\n### AI traffic\n\n| Tool                        | Description                                                  |\n| --------------------------- | ------------------------------------------------------------ |\n| `get_geo_traffic_overview`  | Crawler and AI-referral totals, sources and daily timeseries |\n| `get_geo_traffic_log`       | Most recent individual AI crawler/referral requests          |\n| `list_geo_traffic_journeys` | Sessions grouped by journey                                  |\n| `get_geo_traffic_journey`   | Every event in one journey                                   |\n| `list_geo_traffic_pages`    | Most visited pages by AI traffic                             |\n| `get_geo_ingest_setup`      | Tracking install snippets and ingest endpoint                |\n| `issue_geo_ingest_token`    | Issue the tracking token                                     |\n| `rotate_geo_ingest_token`   | Rotate the token, invalidating all previously issued tokens  |\n\n### Feedback\n\n| Tool              | Description                                                                         |\n| ----------------- | ----------------------------------------------------------------------------------- |\n| `submit_feedback` | Send a bug report, feature request, question or praise to the Notra inbox (no auth) |\n\n## Development\n\nUse Node 22.12+ (Node 22) or Node 24 and the pnpm version pinned in `package.json`:\n\n```sh\ncorepack enable\npnpm install --frozen-lockfile\npnpm test\npnpm run test:coverage\npnpm run typecheck\npnpm run format:check\n```\n\nVitest runs directly against the source with Zod compilation enabled. CI runs tests, typechecking, formatting checks, and the build on pull requests and pushes to `main`.\n",
  "bytes": 14471,
  "sha": "04c68985b9c4a9d0ea721d62b4e2f946e529766e0c401f913c01addc058940ec",
  "repo_slug": "usenotra/notra-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_usenotra_notra_ab2bdad0/readme"
}