Official Perigon news API: articles, stories, companies, journalists, monitors, and stats.
One address for any MCP client. You sign in at mcp.perigon.io once, after adding it.
At most: only reads or looks up information.
Odel charges nothing per call. The publisher may charge for its own service.
Odel could not list its tools without signing in.
Endpoint: https://mcp.perigon.io/v1/mcp
Try it in the playground (requires a signed-in Perigon dashboard session). Human-oriented setup: perigon.io/docs/api/mcp. Install with an agent: pass perigon.io/mcp.md to your AI client and follow the steps (OAuth sign-in, no API key in chat).
Add the server URL only. On first connect, the client discovers OAuth metadata and opens Perigon sign-in. See Authentication.
Native Streamable HTTP:
{
"mcpServers": {
"perigon": {
"url": "https://mcp.perigon.io/v1/mcp",
"type": "http"
}
}
}
mcp-remote (clients without native HTTP):
{
"mcpServers": {
"perigon": {
"command": "npx",
"args": ["-y", "mcp-remote@latest", "https://mcp.perigon.io/v1/mcp"]
}
}
}
Claude Code:
claude mcp add --transport http perigon https://mcp.perigon.io/v1/mcp
Then run /mcp in Claude Code and choose Authenticate when prompted.
Codex CLI — add to ~/.codex/config.toml:
[mcp_servers.perigon]
url = "https://mcp.perigon.io/v1/mcp"
Then run codex mcp login perigon.
Use when the client cannot complete OAuth or you need a fixed key in config. Keys from perigon.io/dev/keys.
Native Streamable HTTP:
{
"mcpServers": {
"perigon": {
"url": "https://mcp.perigon.io/v1/mcp",
"type": "http",
"headers": {
"Authorization": "Bearer YOUR_PERIGON_API_KEY"
}
}
}
}
mcp-remote:
{
"mcpServers": {
"perigon": {
"command": "npx",
"args": [
"-y",
"mcp-remote@latest",
"https://mcp.perigon.io/v1/mcp",
"--header",
"Authorization: Bearer ${PERIGON_API_KEY}"
],
"env": {
"PERIGON_API_KEY": "YOUR_PERIGON_API_KEY"
}
}
}
}
Claude Code:
claude mcp add --transport http perigon https://mcp.perigon.io/v1/mcp \
--header "Authorization: Bearer YOUR_PERIGON_API_KEY"
SSE at /v1/sse exists for legacy clients. Use Streamable HTTP for new integrations.
The MCP endpoint accepts Authorization: Bearer credentials in two forms:
| Method | Bearer value | Best for |
|---|---|---|
| OAuth | MCP access token from the Perigon authorization flow | Desktop and IDE MCP clients; access follows your org membership |
| API key | Perigon API key from the developer dashboard | Scripts, mcp-remote, or configs that pin a key |
Hosted discovery (production):
https://mcp.perigon.io/.well-known/oauth-protected-resource (alias: https://mcp.perigon.io/.well-known/oauth-protected-resource/v1/mcp)https://mcp.perigon.io/.well-known/oauth-authorization-serverClients discover the authorization, token, and registration endpoints from the authorization server metadata (PKCE required).
The client completes the standard authorization-code flow with PKCE, then sends the resulting access token on every MCP request.
Unauthenticated requests receive 401 with a WWW-Authenticate header pointing at the protected-resource metadata URL.
Create or copy a key at perigon.io/dev/keys and set it in the client’s Authorization header (see Quick start examples). Scopes and quotas follow that key.
Append ?tools= to the MCP URL to limit the session. ?tool= is an alias and wins if both are present.
https://mcp.perigon.io/v1/mcp?tools=search_news_articles,search_news_stories
https://mcp.perigon.io/v1/mcp?tools=research
https://mcp.perigon.io/v1/mcp?tools=research,create_monitor
https://mcp.perigon.io/v1/mcp?tools=all
all → scope-allowed default tools plus every opt-in catalogue tool (monitor write, platform helpers, get_source_by_id, get_top_topics, get_story_stats, and the rest). Scope-gated search tools still require the matching permission.| Profile | Tools |
|---|---|
research | search_news_articles, search_news_stories, search_story_history, search_vector_news, summarize_news, search_journalists, search_sources, search_people, search_companies, search_topics, the five stats tools, get_top_topics, get_source_by_id, get_api_access. Not Wikipedia, and not the company / person / location shortcuts. |
monitoring | All monitor tools (including create_monitor / update_monitor) plus every Signal Insights tool. |
platform | watchlists, create_watchlist, update_watchlist, source_groups, create_source_group, update_source_group, contact_points, article_refresh, get_api_access. |
minimal | search_news_articles, the five stats tools, get_api_access. |
get_story_stats is not in any profile. Request it by name. Requires the CLUSTERS scope.
Availability:
?tools= is omitted (and the key has the listed scope, if any).?tools=all. Registration is not the same as API access.| Tool | Availability | Description |
|---|---|---|
search_news_articles | Default | Keyword and filter search over individual articles, including Boolean queries. |
search_news_stories | Scope: CLUSTERS | Clustered headlines that group related articles into one narrative. |
search_story_history | Scope: CLUSTERS | Timestamped snapshots of how a story cluster changed. |
search_vector_news | Scope: VECTOR_SEARCH_NEWS | Semantic search over recent articles. |
summarize_news | Scope: SEARCH_SUMMARY | AI summary of matching articles, with citations. |
search_journalists | Scope: JOURNALISTS | Journalist and reporter profiles. |
search_sources | Scope: SOURCES | News publications and outlets. |
search_people | Scope: PEOPLE | Public-figure profiles. |
search_companies | Scope: COMPANIES | Company profiles (domain, ticker, industry). |
search_topics | Scope: TOPICS | Perigon topic taxonomy for exact topic filters. |
search_wikipedia | Scope: WIKIPEDIA | Keyword search of Wikipedia pages. |
search_vector_wikipedia | Scope: VECTOR_SEARCH_WIKIPEDIA | Semantic search of Wikipedia pages. |
Each tool looks up an entity, then searches recent articles about it.
| Tool | Availability | Description |
|---|---|---|
get_company_news | Scope: COMPANIES | Recent articles about a company looked up by name. |
get_person_news | Scope: PEOPLE | Recent articles about a person looked up by name. |
get_location_news | Scope: LOCATIONS | Recent articles for a city, state, or country. |
Always on for any valid key. Prefer these over counting search results by hand.
| Tool | Availability | Description |
|---|---|---|
get_avg_sentiment | Default | Average sentiment (positive / negative / neutral) bucketed over time. |
get_article_counts | Default | Article publication volume bucketed over time. |
get_top_entities | Default | Most-mentioned topics, people, companies, cities, journalists, or sources. |
get_top_people | Default | People whose coverage is spiking versus a baseline. |
get_top_companies | Default | Companies whose coverage is spiking versus a baseline. |
| Tool | Availability | Description |
|---|---|---|
get_api_access | Default | This key's scopes, organization, quota, and entitlement behavior. Does not count against request quota. Call once per session, or after a 403. |
Read tools are default. Write tools are opt-in because the shared monitor schema is large.
| Tool | Availability | Description |
|---|---|---|
list_monitors | Default | List and filter monitors by UUID, name, status, or EVENT / MENTIONS / TOPIC. |
get_monitor | Default | Full monitor configuration. |
get_monitor_events | Default | Structured events from EVENT and MENTIONS monitors. |
get_monitor_newsletters | Default | Scheduled briefings, typically from TOPIC monitors. |
get_monitor_summaries | Default | Rolling AI-generated monitor summary history. |
set_monitor_status | Default | Activate, pause, or archive a monitor. Archiving cannot be reversed through the public API. |
create_monitor | Opt-in | Create a DRAFT or ACTIVE monitor. Defaults to DRAFT. |
update_monitor | Opt-in | Partial update; omitted fields are preserved. |
All of these are opt-in. get_source_by_id and get_top_topics are also in research. get_story_stats is name-only.
| Tool | Availability | Description |
|---|---|---|
get_source_by_id | Opt-in | One news source by exact ID or domain. |
get_top_topics | Opt-in | Topics whose coverage is spiking versus a baseline. |
get_story_stats | Opt-in; Scope: CLUSTERS | Story-level publication volume or velocity over time. |
watchlists | Opt-in | List, get, or resolve organization watchlists. |
create_watchlist / update_watchlist | Opt-in | Create or partially update a watchlist. |
source_groups | Opt-in | List, get, or resolve custom source-group bundles. |
create_source_group / update_source_group | Opt-in | Create or partially update a source group. |
contact_points | Opt-in | List or get monitor notification channels (email / webhook). |
article_refresh | Opt-in | Check a refresh job or peek cached data for up to 100 article IDs. Read-only. |
Registered for every session unless ?tools= excludes them.
The monitoring profile includes this set. There is no Signal Insights-only profile; pass the tool names if you want only these.
| Tool | Availability | Description |
|---|---|---|
signal_insights_create_workspace | Default | Create a workspace. Call once at the start of a conversation. |
signal_insights_search_signals | Default | Search signals by name or objective. |
signal_insights_read_signal | Default | Signal metadata (classification, schema or newsletter counts). |
signal_insights_list_newsletters | Default | Newsletter titles and excerpts for a TOPIC signal. |
signal_insights_read_newsletter | Default | Full newsletter content as markdown. |
signal_insights_export_events | Default | Export EVENT / MENTIONS events into your workspace. Returns a preview and file path. |
signal_insights_execute_code | Default | Run Python analysis in your workspace (pandas, numpy, matplotlib). |
signal_insights_preview_chart | Default | Render charts in the interactive chart viewer. |
signal_insights_shell | Default | Run shell commands in your workspace. |
signal_insights_list_files | Default | List files in the workspace. |
signal_insights_read_file | Default | Read a workspace file. |
signal_insights_write_file | Default | Write a workspace file. |
signal_insights_grep | Default | Regex search over file contents. |
signal_insights_str_replace | Default | Find and replace a string in a file. |
Hosts that support MCP prompts can invoke these playbooks:
entity_deep_divenarrative_tracecoverage_trendjournalist_beat_profilecompetitive_landscapespike_explainerOn-demand reference resources:
perigon://reference/fields — response field semanticsperigon://reference/chaining — cross-endpoint research playbooksperigon://reference/entitlements — this session's scope-to-behavior mapperigon://reference/charts — Signal Insights chart formatting rulesMCP Apps viewers (registered when any Signal Insights tool is active):
ui://signal-insights/chart-viewerui://signal-insights/export-viewersignal_insights_create_workspace once at the start of a conversation.artifacts/ (exports and query results go there automatically). Put user-facing deliverables in artifacts/output/. File and shell tools can write elsewhere in the workspace, but only artifacts/ is backed by persistent storage.artifacts/ remain. Other workspace paths may be empty on a fresh sandbox.Give the model the current date (or a date tool). Some models otherwise treat their knowledge cutoff as "today" and fetch stale news.
Examples:
Registry name: io.github.goperigon/perigon-mcp-server.
server.json is the source of truth. A published version is immutable. Bump version in server.json and republish after any listing change.
This repo uses Bun. Copy .dev.vars.example to .dev.vars (gitignored) and fill in values.
| Variable | Required | Description |
|---|---|---|
ANTHROPIC_API_KEY | Yes | Must be set for the worker to start; any non-empty value works. A real key is only needed for playground chat (/v1/api/chat). |
PERIGON_API_KEY | Playground | Playground default key when testing with a manual API key. |
PERIGON_API_URL | Optional | Perigon API base URL. Defaults in wrangler.jsonc for local dev. |
PERIGON_APP_URL | Optional | App base URL for the OAuth consent page linked from discovery metadata. |
MCP_PUBLIC_URL | Optional | Public MCP origin used in OAuth metadata (defaults to local dev URL). |
The dev server binds to local-mcp.perigon.io (see vite.config.ts). Add this line to /etc/hosts so that hostname resolves on your machine:
127.0.0.1 local-mcp.perigon.io
bun i
bun dev
bun test
bun dev serves the MCP worker and the playground at https://local-mcp.perigon.io:5173.
Open a GitHub issue or pull request for bugs, missing tools, or use cases. Someone at Perigon will review it.
Report security issues privately. See SECURITY.md. Do not open a public issue.
Maintained by the Perigon team: