MCP
Read-only public server
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_…orX-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.