{
  "$schema": "https://modelcontextprotocol.io/schema/server-card/draft.json",
  "name": "wpnews",
  "version": "2.1.0",
  "protocolVersion": "2025-06-18",
  "description": "AI/tech news index built for AI agents. Search, topic/entity browsing, full article fetch, trending detection, and prompt templates.",
  "homepage": "https://wpnews.pro",
  "license": "MIT",
  "serverInfo": {
    "name": "wpnews",
    "version": "2.1.0",
    "description": "AI/tech news index built for AI agents.",
    "publisher": "wpnews.pro",
    "license": "MIT",
    "homepage": "https://wpnews.pro"
  },
  "transport": {
    "type": "streamable-http",
    "endpoint": "https://wpnews.pro/mcp",
    "alternates": [
      {
        "type": "http+sse",
        "endpoint": "https://api.wpnews.pro/mcp/sse"
      },
      {
        "type": "stdio",
        "command": "npx",
        "args": [
          "-y",
          "wpnews-mcp@latest"
        ]
      }
    ]
  },
  "capabilities": {
    "tools": true,
    "resources": true,
    "prompts": true,
    "logging": false
  },
  "tools": [
    {
      "name": "search",
      "description": "Full-text search across all wpnews articles. Returns matching articles with title, summary, slug, URL, and published_at. Use this when the user asks about a specific topic, product, event, or phrase ('latest on Claude', 'GPT-5 news', etc.). Pass `exclude_seen: true` (with a Mcp-Session-Id header) to suppress slugs already returned this session \u2014 avoids showing the same article twice in a multi-turn conversation.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "q": {
            "type": "string",
            "description": "Search query (free-form)"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 10
          },
          "exclude_seen": {
            "type": "boolean",
            "description": "Suppress slugs already shown in this session",
            "default": false
          }
        },
        "required": [
          "q"
        ]
      }
    },
    {
      "name": "latest",
      "description": "Get the N most recently published articles. Use for 'what's new', 'latest news', 'today's AI updates' style queries. Pass `exclude_seen: true` (with Mcp-Session-Id header) to paginate forward without re-seeing earlier results.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 10
          },
          "hours": {
            "type": "integer",
            "minimum": 1,
            "maximum": 168,
            "description": "Optional: restrict to last N hours"
          },
          "exclude_seen": {
            "type": "boolean",
            "description": "Suppress slugs already shown in this session",
            "default": false
          }
        }
      }
    },
    {
      "name": "topic",
      "description": "List articles for a specific topic slug. Topic slugs are kebab-case, e.g. 'large-language-models', 'ai-safety', 'developer-tools'. Use `list_topics` to discover valid slugs.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string",
            "description": "Topic slug"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 20
          }
        },
        "required": [
          "slug"
        ]
      }
    },
    {
      "name": "entity",
      "description": "List articles mentioning a specific named entity \u2014 company, product, person, or AI model. Entity names are case-sensitive as extracted from articles (e.g. 'OpenAI', 'Claude', 'GPT-5').",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Entity name"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 20
          }
        },
        "required": [
          "name"
        ]
      }
    },
    {
      "name": "article",
      "description": "Fetch a single article by slug. Returns full body in Markdown plus metadata. Use after `search` or `latest` to get full text.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string",
            "description": "Article slug"
          }
        },
        "required": [
          "slug"
        ]
      }
    },
    {
      "name": "list_topics",
      "description": "List all available topic slugs with article counts.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    },
    {
      "name": "trending",
      "description": "Get currently trending topics and entities \u2014 what AI/tech news is gaining velocity right now. Use for 'what's hot', 'rising trends' queries.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "days": {
            "type": "integer",
            "minimum": 1,
            "maximum": 30,
            "default": 7
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 10
          }
        }
      }
    },
    {
      "name": "stats",
      "description": "Service health + corpus stats: total articles, sources, last update time, server version. Use as a sanity check.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    },
    {
      "name": "bulk_articles",
      "description": "Fetch multiple articles by slug in one call. Use after `search` or `latest` to load several full bodies at once \u2014 saves round trips vs calling `article` repeatedly. Max 20 slugs per call.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "slugs": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 20,
            "description": "Array of article slugs"
          }
        },
        "required": [
          "slugs"
        ]
      }
    },
    {
      "name": "find_related",
      "description": "Given an article slug, return semantically related articles from the same topic cluster. Useful for following a thread across our coverage.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5
          }
        },
        "required": [
          "slug"
        ]
      }
    },
    {
      "name": "since",
      "description": "List articles published after a given ISO date (e.g. '2026-05-22'). Useful for incremental polling \u2014 pull only what's new since the agent's last sync timestamp.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "iso_date": {
            "type": "string",
            "description": "ISO date or datetime (YYYY-MM-DD or full timestamp)"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 30
          }
        },
        "required": [
          "iso_date"
        ]
      }
    },
    {
      "name": "session_memory",
      "description": "Inspect or reset the current session's autobiographical state \u2014 list of article slugs already returned to this client in this session, plus recent queries. Set `action: \"reset\"` to clear. Requires `Mcp-Session-Id` header to be passed on every request.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "action": {
            "type": "string",
            "enum": [
              "inspect",
              "reset"
            ],
            "default": "inspect"
          }
        }
      }
    }
  ],
  "resources": [
    {
      "uri": "wpnews://feed/latest",
      "name": "Latest articles feed",
      "description": "Most recent 20 articles as a markdown digest.",
      "mimeType": "text/markdown"
    },
    {
      "uri": "wpnews://corpus/llms-full",
      "name": "Full corpus (LLM-ready)",
      "description": "100 most recent articles concatenated as one markdown document.",
      "mimeType": "text/markdown"
    },
    {
      "uri": "wpnews://corpus/index",
      "name": "Article index (JSON)",
      "description": "Metadata for all articles \u2014 slug, title, summary, URLs.",
      "mimeType": "application/json"
    },
    {
      "uri": "wpnews://self-improvement/digest",
      "name": "Self-improvement digest",
      "description": "Latest weekly self-mining digest \u2014 corpus articles describing techniques that could upgrade wpnews.pro, grouped by subsystem.",
      "mimeType": "text/markdown"
    }
  ],
  "prompts": [
    {
      "name": "summarize_today",
      "description": "Build a brief summary of today's top AI/tech stories.",
      "arguments": []
    },
    {
      "name": "find_emerging_trends",
      "description": "Identify topics/entities with rising mention velocity in the past week. Useful for trendspotting.",
      "arguments": [
        {
          "name": "days",
          "description": "Lookback window (1-14)",
          "required": false
        }
      ]
    },
    {
      "name": "compare_entities",
      "description": "Compare two entities by mention volume, co-occurring topics, and recent activity.",
      "arguments": [
        {
          "name": "a",
          "description": "First entity name",
          "required": true
        },
        {
          "name": "b",
          "description": "Second entity name",
          "required": true
        }
      ]
    }
  ],
  "authentication": {
    "type": "apiKey",
    "header": "X-API-Key",
    "freeTierUrl": "https://wpnews.pro/api"
  },
  "documentation": "https://wpnews.pro/integrations"
}