Notra

Notra

@usenotra3TypeScriptMITUpdated 1w ago

Access the Notra API for posts, brand identities, integrations, schedules, and GEO.

Server endpointStreamable HTTPOAuthProbed

This is the third-party server itself — Odel doesn't run it. Hitting this URL directly talks straight to the upstream server with no auth or proxying. Connect through Odel to front it with managed auth.

Notra MCP Server

An MCP (Model Context Protocol) server for the Notra API. It manages posts, brand identities, integrations, schedules, GEO visibility scans, competitors, content briefs, and AI traffic analytics.

Setup

You can generate an API key from your Notra workspace dashboard under Developer > API Keys.

Node.js 20 or newer is required.

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "notra": {
      "command": "npx",
      "args": ["-y", "@usenotra/mcp"],
      "env": {
        "NOTRA_API_KEY": "your-api-key"
      }
    }
  }
}

Claude Code

claude mcp add notra -- npx -y @usenotra/mcp

Then set the NOTRA_API_KEY environment variable in your shell before launching Claude Code.

Codex

export NOTRA_API_KEY=your-api-key
codex mcp add notra --env NOTRA_API_KEY="$NOTRA_API_KEY" -- npx -y @usenotra/mcp

Run codex mcp list to verify the connection. The Codex CLI, desktop app, and IDE extension share this MCP configuration.

OpenCode

Set NOTRA_API_KEY in your shell, then add the server to your project-level opencode.json or the global ~/.config/opencode/opencode.json:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "notra": {
      "type": "local",
      "command": ["npx", "-y", "@usenotra/mcp"],
      "enabled": true,
      "environment": {
        "NOTRA_API_KEY": "{env:NOTRA_API_KEY}"
      }
    }
  }
}

Amp

Run amp config edit and add the following to your settings, or place it in .amp/settings.json for a workspace-specific configuration:

{
  "amp.mcpServers": {
    "notra": {
      "command": "npx",
      "args": ["-y", "@usenotra/mcp"],
      "env": {
        "NOTRA_API_KEY": "${NOTRA_API_KEY}"
      }
    }
  }
}

Set NOTRA_API_KEY in the environment before launching Amp. Workspace MCP servers may require approval with amp mcp approve notra.

Remote MCP (OAuth)

The 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:

https://mcp.usenotra.com/.well-known/oauth-protected-resource

That 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.

API key alternative

Remote connections also accept a Notra API key as a static Authorization: Bearer … header. Generate one from your Notra workspace dashboard under Developer > API Keys. OAuth-capable clients should prefer the OAuth flow instead of manual key configuration.

For self-hosted HTTP deployments, OAuth validation can be configured with:

WORKOS_AUTHKIT_DOMAIN=oauth.usenotra.com
WORKOS_CLIENT_ID=client_xxx
NOTRA_MCP_RESOURCE=https://mcp.usenotra.com

The 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.

When 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.

Legacy 2025 sessions expire after 30 minutes of inactivity. Each OAuth user or API key can hold NOTRA_MCP_MAX_SESSIONS_PER_PRINCIPAL sessions (default 50); beyond that, its own least recently used session closes. When the server holds NOTRA_MCP_MAX_SESSIONS sessions (default 1000), new sessions are rejected with HTTP 503 and Retry-After instead of closing other users' sessions.

Toolsets

All 97 tools are exposed by default, which costs roughly 20k tokens of agent context. To load only what you need, pick toolsets with NOTRA_MCP_TOOLSETS (stdio and HTTP) or the toolsets query parameter on the remote endpoint:

ToolsetTools
contentPosts, brand identities, integrations, schedules, event triggers, chats, agent sessions, skills, feedback inbox
geoProjects and every GEO tool

Workspace tools and submit_feedback are always available.

NOTRA_MCP_TOOLSETS=content npx -y @usenotra/mcp
https://mcp.usenotra.com/mcp?toolsets=geo

Tools

Workspace

ToolDescription
whoamiShow the current workspace and authenticated account information
list_workspacesList accepted and pending workspaces available to the authenticated account

Each MCP connection operates in the workspace bound to its bearer token. To act in another workspace, authorize a separate connection for that workspace; list_workspaces discovers access but does not switch credentials.

Posts

ToolDescription
list_postsList posts with optional filters for sorting, pagination, status, content type, and brand identity
get_postGet a single post by ID
create_postCreate a post from your own title and markdown
update_postUpdate a post's title, markdown, or status
delete_postDelete a post
generate_postQueue async post generation from GitHub activity
get_post_generation_statusCheck the status of a post generation job

Brand Identities

ToolDescription
list_brand_identitiesList all brand identities
get_brand_identityGet a single brand identity by ID
update_brand_identityUpdate brand identity settings
delete_brand_identityDelete a brand identity
generate_brand_identityQueue async brand identity generation from a website URL
get_brand_identity_generation_statusCheck the status of a brand identity generation job

Integrations

ToolDescription
list_integrationsList all connected integrations (GitHub, Slack, Linear)
create_github_integrationConnect a GitHub repository
delete_integrationDelete a GitHub or Linear integration

Schedules

ToolDescription
list_schedulesList scheduled content generation jobs
create_scheduleCreate a scheduled content generation job
update_scheduleUpdate a scheduled content generation job
delete_scheduleDelete a scheduled content generation job

Event Triggers

ToolDescription
list_event_triggersList triggers that generate content from GitHub releases or pushes
get_event_triggerGet a single event trigger by ID
create_event_triggerCreate an event trigger
update_event_triggerReplace an event trigger's configuration
delete_event_triggerDelete an event trigger

Chats

ToolDescription
list_chatsList chat sessions
get_chatGet a single chat with messages
get_chat_by_external_channelGet a chat by Discord or Slack channel ID
create_chatStart a new chat and return the streamed reply
post_chat_messagePost a message to an existing chat and return the streamed reply
list_agent_chatsList durable agent sessions and their status

Skills

ToolDescription
list_skillsList reusable writing skills
get_skillGet a single skill by name
create_skillCreate a reusable writing skill
update_skillUpdate a reusable writing skill
delete_skillDelete a reusable writing skill

Projects

GEO 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.

ToolDescription
list_projectsList the organization's GEO projects
get_projectGet a single project by ID
create_projectCreate a project, optionally linked to a brand
update_projectRename a project or relink its brand identity
delete_projectDelete a project and all of its GEO data (cascading)

GEO settings

ToolDescription
get_geo_settingsGet tracked company, aliases, languages, engines and scan config
update_geo_settingsReplace the settings document and restart the scan cycle

GEO prompts and sequences

ToolDescription
list_geo_promptsList tracked prompts (custom and auto-derived)
create_geo_promptTrack a new prompt
update_geo_promptEnable or disable a tracked prompt
delete_geo_promptStop tracking a prompt
import_geo_promptsBulk import prompts from rows or CSV
list_geo_sequencesList multi-turn prompt sequences
create_geo_sequenceCreate a prompt sequence
update_geo_sequenceUpdate a sequence's name, steps or enabled state
delete_geo_sequenceDelete a sequence
run_geo_sequenceRun a sequence now, synchronously (uses AI credits, can take minutes)

GEO competitors

ToolDescription
list_geo_competitorsList tracked competitors
upsert_geo_competitorCreate, update or rename a competitor
suggest_geo_competitorsAI-discover likely competitors for a domain
delete_geo_competitorStop tracking a competitor
import_geo_competitorsBulk import competitors from rows or CSV

GEO scans and visibility

ToolDescription
create_geo_scanTrigger an async visibility scan (uses AI credits)
list_geo_scansList scans with pagination
get_geo_scanGet a scan and its status
get_geo_snapshotCompact cross-signal diagnosis and recommended next actions
get_geo_changesChanges between the two latest scans
get_geo_visibility_overviewMention rates per answer engine
get_geo_visibility_timeseriesDaily mention counts per engine
list_geo_prompt_result_summariesFiltered, paginated results without full answers or URLs
get_geo_prompt_result_detailFull answer and sources for one check
get_geo_prompt_historyCompact historical checks for one prompt
get_geo_prompt_resultsAll latest answers; prefer summaries for large projects
get_geo_sentimentSentiment metrics and previous-period comparison
get_geo_sentiment_analysisStored thematic sentiment analysis
list_geo_sentiment_evidencePaginated answers behind sentiment metrics
list_geo_shelf_sourcesPaginated citation shelf and opportunity state
get_geo_competitor_shareShare of voice across tracked brands
get_geo_language_shareMention rates per tracked language
get_geo_competitor_detailOne competitor's mention history and the prompts driving it

GEO content briefs

ToolDescription
list_geo_content_gapsPrompts where competitors are mentioned and this brand is not
list_geo_content_briefsList content briefs and their statuses
plan_geo_content_briefResearch a topic and plan a brief (billed, can take minutes)
get_geo_content_briefGet a brief with the full document and writer status
approve_geo_content_briefApprove a brief and start the article writer

Agent readiness

ToolDescription
get_geo_agent_readinessLatest readiness report, score history and any scan in flight
start_geo_agent_readiness_scanQueue a readiness scan of the project's website

AI traffic

ToolDescription
get_geo_traffic_overviewCrawler and AI-referral totals, sources and daily timeseries
get_geo_traffic_logMost recent individual AI crawler/referral requests
list_geo_traffic_journeysSessions grouped by journey
get_geo_traffic_journeyEvery event in one journey
list_geo_traffic_pagesMost visited pages by AI traffic
get_geo_ingest_setupTracking install snippets and ingest endpoint
issue_geo_ingest_tokenIssue the tracking token
rotate_geo_ingest_tokenRotate the token, invalidating all previously issued tokens

Feedback

ToolDescription
submit_feedbackSend a bug report, feature request, question or praise to the Notra inbox (no auth)
list_feedbackList feedback the organization received, by status, kind or project
get_feedbackGet one feedback entry with agent metadata
update_feedbackSet a feedback entry's triage status

Development

Use Node 22.12+ (Node 22) or Node 24 and the pnpm version pinned in package.json:

corepack enable
pnpm install --frozen-lockfile
pnpm test
pnpm run test:coverage
pnpm run typecheck
pnpm run format:check

Tool output schemas in src/schemas/api-responses.ts are generated from the Notra OpenAPI spec. Run pnpm run generate:output-schemas after the API changes; CI fails when the file is stale.

Vitest 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.