Skip to content
Greensburg Times

MCP

Read-only public server

Streamable HTTP at one stateless endpoint. Same keys and limits as the public API. No writes.

POST JSON-RPC to https://greensburgtimes.com/api/public-mcp. The server does not keep a session. Each request stands alone and the response is one JSON object. Send Accept: application/json, text/event-stream.

This server is separate from the admin Payload MCP at /api/mcp. A Payload user API key (users API-Key) is refused. Use a gt_ key, or call with no key inside the anonymous allowance.

  • Anonymous: 20 requests a minute and 200 a day, per IP address.
  • Free key: 60 requests a minute and 1000 a day. Send it as Authorization: Bearer gt_… or X-API-Key.
  • Each tool call counts as one request. A bad, revoked, or suspended key is refused.

Keys and the REST contract are on the developers page.

Tools

Every record includes sourceUrl and lastVerifiedAt. Article bodies are not returned. get_election_info does not scrape. It returns the election dates, the state polling lookup, and published events and articles already stored here, plus a note when that set is thin.

  • search_events — Published events. Optional q, from, to, and municipality.
  • get_fish_fries — Active fish fries. Optional municipality and a day named in the schedule text.
  • find_officials — Published officials. Optional name, office, governingBody, and municipality.
  • get_organization — One organization by slug or public id, or a name search with q.
  • get_election_info — Election dates, polling link, and published election events and articles already on the site.
  • search_articles — Published articles by title. Title, summary, and url only.

Cursor

Open Cursor Settings, then MCP, and add a remote server. Or put this in .cursor/mcp.json in the project, or in ~/.cursor/mcp.json for every project. Replace gt_your_key. Leave the header out to use the anonymous allowance.

{
  "mcpServers": {
    "greensburg-times": {
      "url": "https://greensburgtimes.com/api/public-mcp",
      "headers": {
        "Authorization": "Bearer gt_your_key"
      }
    }
  }
}

Claude Desktop

Edit claude_desktop_config.json. On macOS that file is in ~/Library/Application Support/Claude/. On Windows it is in %APPDATA%\Claude\. Restart Claude Desktop after saving.

{
  "mcpServers": {
    "greensburg-times": {
      "type": "http",
      "url": "https://greensburgtimes.com/api/public-mcp",
      "headers": {
        "Authorization": "Bearer gt_your_key"
      }
    }
  }
}

Generic Streamable HTTP client

Any client that speaks Streamable HTTP can POST to the endpoint. There is no session id to store. A tools/list call and a tools/call are both single requests. The initialize method is accepted and is not required before a tool call.

curl -sS https://greensburgtimes.com/api/public-mcp \
  -H "Authorization: Bearer gt_your_key" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
curl -sS https://greensburgtimes.com/api/public-mcp \
  -H "Authorization: Bearer gt_your_key" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"search_articles","arguments":{"q":"election"}}}'

A refused key returns the same error envelope as the REST API, with X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset. Over the limit, the status is 429 and Retry-After is set.