io.github.cyanheads/guardian-mcp-server
Guardian Open Platform: search and retrieve full article text from The Guardian archive.
ماذا يمكنك أن تفعل مع io.github.cyanheads/guardian-mcp-server؟
- Wraps the Guardian Open Platform API with a free non-commercial developer key
- Full body text extraction — HTML stripped, not just headlines or abstracts
- Contributor ID discovery via
guardian_browse_contentmodelist_tagswithtag_type=contributor - Section and tag taxonomy browsing (
list_sections,list_tags) for filter discovery before searching - Free tier: 5,000 requests/day, 12 calls/second — the server applies no additional throttling
- Search and article-returning browse modes cap previews at 2,000 words and set
truncated; callguardian_get_articlefor the full text - Typed error reasons across all three tools, each paired with a recovery hint
total/page/pageson every paginated response so callers can track result scope
التثبيت
أضف هذا إلى إعدادات MCP في عميلك (Claude Desktop: claude_desktop_config.json، وCursor: .cursor/mcp.json، ويستخدم VS Code وغيره الصيغة نفسها «mcpServers»).
@cyanheads/guardian-mcp-serverclaude mcp add guardian-mcp-server -e 'GUARDIAN_API_KEY=<GUARDIAN_API_KEY>' -e 'MCP_LOG_LEVEL=info' -- npx -y @cyanheads/guardian-mcp-server@0.2.0
{
"mcpServers": {
"guardian-mcp-server": {
"command": "npx",
"args": [
"-y",
"@cyanheads/guardian-mcp-server@0.2.0"
],
"env": {
"GUARDIAN_API_KEY": "<GUARDIAN_API_KEY>",
"MCP_LOG_LEVEL": "info"
}
}
}
}
متغيرات البيئة
GUARDIAN_API_KEYإلزامي API key for The Guardian Open Platform (https://open-platform.theguardian.com/).MCP_LOG_LEVELSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
@cyanheads/guardian-mcp-serverclaude mcp add guardian-mcp-server -e 'MCP_TRANSPORT_TYPE=<MCP_TRANSPORT_TYPE>' -e 'GUARDIAN_API_KEY=<GUARDIAN_API_KEY>' -e 'MCP_HTTP_HOST=127.0.0.1' -e 'MCP_HTTP_PORT=3010' -e 'MCP_HTTP_ENDPOINT_PATH=/mcp' -e 'MCP_AUTH_MODE=none' -e 'MCP_LOG_LEVEL=info' -- npx -y @cyanheads/guardian-mcp-server@0.2.0
{
"mcpServers": {
"guardian-mcp-server": {
"command": "npx",
"args": [
"-y",
"@cyanheads/guardian-mcp-server@0.2.0"
],
"env": {
"MCP_TRANSPORT_TYPE": "<MCP_TRANSPORT_TYPE>",
"GUARDIAN_API_KEY": "<GUARDIAN_API_KEY>",
"MCP_HTTP_HOST": "127.0.0.1",
"MCP_HTTP_PORT": "3010",
"MCP_HTTP_ENDPOINT_PATH": "/mcp",
"MCP_AUTH_MODE": "none",
"MCP_LOG_LEVEL": "info"
}
}
}
}
متغيرات البيئة
MCP_TRANSPORT_TYPESelects the HTTP transport.GUARDIAN_API_KEYإلزامي API key for The Guardian Open Platform (https://open-platform.theguardian.com/).MCP_HTTP_HOSTThe hostname for the HTTP server.MCP_HTTP_PORTThe port to run the HTTP server on.MCP_HTTP_ENDPOINT_PATHThe endpoint path for the MCP server.MCP_AUTH_MODEAuthentication mode to use: 'none', 'jwt', or 'oauth'.MCP_LOG_LEVELSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
التوثيق
مأخوذ من ملف README للمشروع على GitHub ويُحدَّث أسبوعيًا. تفتح الروابط على GitHub.
المحتويات
@cyanheads/guardian-mcp-server
Search, browse, and retrieve full article text from The Guardian's journalism archive (1999–present) via MCP. STDIO or Streamable HTTP.
3 Tools
Overview
The Guardian's journalism archive, 1999 to today. Search full text, browse by section or tag, and fetch individual articles.
Tools
| Tool | Description |
|---|---|
guardian_search_articles | Full-text search across The Guardian's archive with optional section, tag, contributor, and date filters |
guardian_get_article | Fetch a single Guardian article by ID with body text and metadata |
guardian_browse_content | Browse by section or tag, or discover available sections and tags, across four modes |
Capability reference
guardian_search_articles tool
- Boolean
querysyntax (AND/OR/NOT, quoted phrases), optionalsection/tag/contributorandfrom_date/to_date(YYYY-MM-DD) filters;order_by:relevance(default),newest, oroldest;page+page_size(1–50, default 10) - Articles carry metadata, HTML-stripped body text and a
truncatedflag; results includetotal,page,pages,page_size, andorder_by - Fails with
no_resultsorinvalid_date(dates must be real calendar dates) tagaccepts comma (AND), pipe|(OR), hyphen-(NOT), and parentheses, e.g.environment/climate-crisis|environment/flooding. Wrap an OR expression in parentheses when also passingcontributor.
guardian_get_article tool
- Required
article_id: the path-slugidreturned byguardian_search_articlesorguardian_browse_content - Returns HTML-stripped body text, metadata, contributors, pillar/section classification, and
truncated - Fails with
not_found
guardian_browse_content tool
- Four
modevalues:section_latest(requiressection_id),tag_latest(requirestag_id),list_sections,list_tags;page+page_size(1–50, default 10) for articles and tags list_tagsfilters by optionalqueryandtag_type(keyword,contributor,blog,series,tone,type,publication,newspaper-book,newspaper-book-section); output carriesmode,total, and the matchingresults/sections/tagsarray- Fails with
missing_section_id,missing_tag_id,section_not_found, ortag_not_found.tag_idaccepts the same boolean expressions as search'stag.
All three tools also fail with status-specific HTTP errors. Not retryable: unauthorized (401), access_denied (403), request_rejected (400), validation_failed (422), invalid_request, request_conflict, request_not_found, and api_unsupported (501). Retryable: api_timeout (408/425/504), rate_limited (429), and api_error (other 5xx). Each error carries a recovery hint.
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
Guardian-specific:
- Wraps the Guardian Open Platform API with a free non-commercial developer key
- Full body text extraction — HTML stripped, not just headlines or abstracts
- Contributor ID discovery via
guardian_browse_contentmodelist_tagswithtag_type=contributor - Section and tag taxonomy browsing (
list_sections,list_tags) for filter discovery before searching - Free tier: 5,000 requests/day, 12 calls/second — the server applies no additional throttling
Agent-friendly output:
- Search and article-returning browse modes cap previews at 2,000 words and set
truncated; callguardian_get_articlefor the full text - Typed error reasons across all three tools, each paired with a recovery hint
total/page/pageson every paginated response so callers can track result scope
Getting started
Add the following to your MCP client configuration file. Register for a free Guardian Open Platform API key at open-platform.theguardian.com/access.
{
"mcpServers": {
"guardian-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/guardian-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"GUARDIAN_API_KEY": "your-api-key"
}
}
}
}
Or with npx (no Bun required):
{
"mcpServers": {
"guardian-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/guardian-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"GUARDIAN_API_KEY": "your-api-key"
}
}
}
}
Or with Docker:
{
"mcpServers": {
"guardian-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"-e", "GUARDIAN_API_KEY=your-api-key",
"ghcr.io/cyanheads/guardian-mcp-server:latest"
]
}
}
}
For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 GUARDIAN_API_KEY=your-api-key bun run start:http
# Server listens at http://localhost:3010/mcp
Prerequisites
- Bun v1.4.0 or higher (or Node.js v24+).
- A free Guardian Open Platform API key — register at open-platform.theguardian.com/access. The non-commercial developer tier is free and instant.
Installation
- Clone the repository:
git clone https://github.com/cyanheads/guardian-mcp-server.git
- Navigate into the directory:
cd guardian-mcp-server
- Install dependencies:
bun install
- Configure environment:
cp .env.example .env
# Edit .env and set GUARDIAN_API_KEY
Configuration
| Variable | Description | Default |
|---|---|---|
GUARDIAN_API_KEY | Required. Free developer key from open-platform.theguardian.com/access. | — |
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | Port for HTTP server. | 3010 |
MCP_SESSION_MODE | HTTP session mode: stateless, stateful, or auto (resolves to stateful). The server declares stateless; an exported value overrides it. | stateless |
MCP_AUTH_MODE | Auth mode: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (RFC 5424). | info |
LOGS_DIR | Directory for log files (Node.js only). | <project-root>/logs |
LOG_TOOL_FAILURE_PAYLOADS | Log failed tool arguments and results, redacted by key name and capped by LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES (default 16384). Secrets in free-form values remain visible. | false |
STORAGE_PROVIDER_TYPE | Storage backend. | in-memory |
OTEL_ENABLED | Enable OpenTelemetry instrumentation (spans, metrics, completion logs). | false |
OTEL_EXPORTER_OTLP_ENDPOINT | Base OTLP URL; traces use /v1/traces, metrics use /v1/metrics. | — |
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT | Opt-in OTLP log endpoint, used as-is. | — |
See .env.example for the full list of optional overrides.
Running the server
Local development
- Build and run:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http - Run checks and tests:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t guardian-mcp-server .
docker run --rm -e GUARDIAN_API_KEY=your-api-key -p 3010:3010 guardian-mcp-server
The Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/guardian-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
| Directory | Purpose |
|---|---|
src/index.ts | createApp() entry point — registers tools and initializes the Guardian service. |
src/config | Server-specific environment variable parsing (GUARDIAN_API_KEY). |
src/mcp-server/tools | Tool definitions (*.tool.ts): guardian_search_articles, guardian_get_article, guardian_browse_content. |
src/services/guardian | Guardian Open Platform API client, normalization, and type definitions. |
tests/ | Unit and integration tests. |
docs/ | Design document and directory tree. |
Development guide
See CLAUDE.md / AGENTS.md for development guidelines and architectural rules. The short version:
- Handlers throw, framework catches — no
try/catchin tool logic - Use
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storage - Register new tools in the
createApp()toolsarray insrc/index.ts - Wrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
License
Apache-2.0 — see LICENSE for details.
Powered by The Guardian.
الأسئلة الشائعة
ما هو io.github.cyanheads/guardian-mcp-server؟
Guardian Open Platform: search and retrieve full article text from The Guardian archive.
كيف أثبّت io.github.cyanheads/guardian-mcp-server؟
يعمل على جهازك. في Claude Code: claude mcp add guardian-mcp-server -e 'GUARDIAN_API_KEY=<GUARDIAN_API_KEY>' -e 'MCP_LOG_LEVEL=info' -- npx -y @cyanheads/guardian-mcp-server@0.2.0. وفي العملاء الآخرين، الصق إعداد JSON من هذه الصفحة في إعدادات MCP الخاصة بهم.
هل يحتاج io.github.cyanheads/guardian-mcp-server إلى مفتاح API؟
نعم. يتطلب GUARDIAN_API_KEY، وتضبطها في إعداداته.
هل io.github.cyanheads/guardian-mcp-server مفتوح المصدر؟
نعم. شيفرته متاحة على GitHub بترخيص Apache-2.0.
من يصون io.github.cyanheads/guardian-mcp-server؟
ينشره cyanheads. يدرجه AI.tn لكنه لا يصونه ولا يوصي به.
من سجل MCP الرسمي. الإدراج ليس توصية: راجع شيفرة الخادم وصلاحياته قبل منحه الوصول إلى بياناتك.