Scorekeeper MCP
Scorekeeper MCP allows AI agents to create, manage, and score generic two-team live scoreboards via Streamable HTTP. It supports OAuth authentication, real-time updates, spectator link sharing, and integration with Stripe for paid upgrades or entry fees. The server handles board creation, scoring, and handoff to human users, though it does not support complex tournament brackets or sport-specific rules.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://www.scorekeeper.co/api/mcpWhat its tools do
11 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Passed Official MCP Registry namespace is tied to scorekeeper.co ·
- Passed Endpoint is on the registry namespace domain ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Create and manage live two-team scoreboards for trivia or sports
- Share real-time scoreboard links with spectators
- Process payments for Pro features or tournament entry fees via Stripe
- Hand off scoreboard control from an AI agent to a human user
Source and maintenance
- Last repository push
- Latest release
- v1.0.0
- Maintenance checked
Protocol and capabilities
- Server
- scorekeeper 1.2.0
- MCP protocol negotiated in check
- 2025-06-18
- Tools
- 11 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- Not advertised
{
"tools": {
"listChanged": true
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
11 advertised
get_service_info — Get setup, capabilities and prices
Start here to discover Scorekeeper's MCP/OAuth and guest REST onboarding, supported scoreboard operations, free limits, current prices and payment steps. Public; no account or authentication needed. Does not create anything.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name",
"publisher",
"version"
],
"properties": {
"name": {
"type": "string"
},
"version": {
"type": "string"
},
"publisher": {
"type": "string"
}
},
"additionalProperties": true
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_account — Read your access and limits
Read only the connected account's current plan, expiry, board capacity and permissions. Call before offering a paid upgrade. Requires explicit billing:read permission; returns no personal or payment details.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}create_checkout — Start an authorized purchase
Create a private Stripe checkout for a current offer after the user expresses purchase intent. Explain price, duration and annual renewal before proceeding. This tool does not charge a card: give checkoutUrl privately to the buyer for payment authorization. Reuse the exact requestId/input after uncertainty; never create a replacement checkout to retry. Pro and Studio passes accept months=1–12 and never auto-renew; annual offers are recurring. Requires billing:checkout.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"requestId",
"offerId"
],
"properties": {
"months": {
"type": "integer",
"maximum": 12,
"minimum": 1
},
"offerId": {
"enum": [
"pro_week",
"pro",
"studio",
"pro_annual",
"studio_annual"
],
"type": "string"
},
"requestId": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{8,128}$"
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id",
"offerId",
"months",
"amountCents",
"currency",
"checkoutUrl",
"checkoutStatus",
"paymentStatus",
"fulfillmentStatus"
],
"properties": {
"id": {
"type": "string"
},
"months": {
"type": "integer"
},
"offerId": {
"enum": [
"pro_week",
"pro",
"studio",
"pro_annual",
"studio_annual"
],
"type": "string"
},
"currency": {
"type": "string",
"const": "USD"
},
"amountCents": {
"type": "integer"
},
"checkoutUrl": {
"type": [
"string",
"null"
]
},
"paymentStatus": {
"enum": [
"pending",
"unpaid",
"paid",
"no_payment_required"
],
"type": "string"
},
"checkoutStatus": {
"enum": [
"creating",
"open",
"complete",
"expired"
],
"type": "string"
},
"fulfillmentStatus": {
"enum": [
"pending",
"fulfilled"
],
"type": "string"
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}get_checkout — Check payment and access
Read the connected account's checkout by its returned opaque id. Only fulfillmentStatus=fulfilled confirms webhook-granted access; paid/completed alone is insufficient. Poll no more often than every 15 seconds. Return to the requested scoreboard task once access is granted.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id",
"offerId",
"months",
"amountCents",
"currency",
"checkoutUrl",
"checkoutStatus",
"paymentStatus",
"fulfillmentStatus"
],
"properties": {
"id": {
"type": "string"
},
"months": {
"type": "integer"
},
"offerId": {
"enum": [
"pro_week",
"pro",
"studio",
"pro_annual",
"studio_annual"
],
"type": "string"
},
"currency": {
"type": "string",
"const": "USD"
},
"amountCents": {
"type": "integer"
},
"checkoutUrl": {
"type": [
"string",
"null"
]
},
"paymentStatus": {
"enum": [
"pending",
"unpaid",
"paid",
"no_payment_required"
],
"type": "string"
},
"checkoutStatus": {
"enum": [
"creating",
"open",
"complete",
"expired"
],
"type": "string"
},
"fulfillmentStatus": {
"enum": [
"pending",
"fulfilled"
],
"type": "string"
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}create_payment_order — Prepare a Stripe CLI payment
Prepare an owner-bound one-time payment order after purchase intent, only when get_service_info pricing.paymentMethods.stripe_cli_pay.available is true. Returns the exact @scorekeeper recipient, USD amount and unique memo for stripe pay. Supports pro_week, pro and studio (1–12 calendar months), never annual subscriptions. This tool sends no money. Separately obtain authorization for the actual Stripe transfer and payer-selected funding account. Reuse identical requestId/input on retry; never pay twice or send without the returned memo.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"requestId",
"offerId"
],
"properties": {
"months": {
"type": "integer",
"maximum": 12,
"minimum": 1
},
"offerId": {
"enum": [
"pro_week",
"pro",
"studio"
],
"type": "string"
},
"requestId": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{8,128}$"
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id",
"offerId",
"months",
"amountCents",
"currency",
"reference",
"createdAt",
"expiresAt",
"paymentStatus",
"fulfillmentStatus",
"orderStatus",
"nextAction",
"pollAfterSeconds",
"accessExpiresAt",
"instructions"
],
"properties": {
"id": {
"type": "string"
},
"months": {
"type": "integer"
},
"offerId": {
"enum": [
"pro_week",
"pro",
"studio"
],
"type": "string"
},
"currency": {
"type": "string",
"const": "USD"
},
"createdAt": {
"type": "number"
},
"expiresAt": {
"type": "number"
},
"reference": {
"type": "string",
"pattern": "^SK[A-F0-9]{20}$"
},
"nextAction": {
"enum": [
"pay_with_stripe_cli",
"check_status",
"contact_support",
"expired",
"complete"
],
"type": "string"
},
"amountCents": {
"type": "integer"
},
"orderStatus": {
"enum": [
"open",
"expired",
"fulfilled",
"review_required"
],
"type": "string"
},
"instructions": {
"anyOf": [
{
"type": "object",
"required": [
"recipient",
"amount",
"currency",
"memo",
"flags"
],
"properties": {
"memo": {
"type": "string"
},
"flags": {
"type": "array",
"items": {
"type": "string",
"const": "--agent"
}
},
"amount": {
"type": "string"
},
"currency": {
"type": "string",
"const": "usd"
},
"recipient": {
"type": "string",
"const": "@scorekeeper"
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"paymentStatus": {
"enum": [
"pending",
"received",
"reversed",
"review_required"
],
"type": "string"
},
"accessExpiresAt": {
"type": [
"number",
"null"
]
},
"pollAfterSeconds": {
"type": "integer"
},
"fulfillmentStatus": {
"enum": [
"pending",
"fulfilled",
"review_required"
],
"type": "string"
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_payment_order — Verify a transfer and activate access
Check only the connected account's payment order and reconcile a bank receipt. May activate access after matching verified received funds. Only fulfillmentStatus=fulfilled confirms access; CLI output or sender status does not. Poll no more often than pollAfterSeconds (at least 60 seconds). Bank transfers can take business days. Never send a replacement payment while pending. review_required or reversed needs support reconciliation, not another payment.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id",
"offerId",
"months",
"amountCents",
"currency",
"reference",
"createdAt",
"expiresAt",
"paymentStatus",
"fulfillmentStatus",
"orderStatus",
"nextAction",
"pollAfterSeconds",
"accessExpiresAt",
"instructions"
],
"properties": {
"id": {
"type": "string"
},
"months": {
"type": "integer"
},
"offerId": {
"enum": [
"pro_week",
"pro",
"studio"
],
"type": "string"
},
"currency": {
"type": "string",
"const": "USD"
},
"createdAt": {
"type": "number"
},
"expiresAt": {
"type": "number"
},
"reference": {
"type": "string",
"pattern": "^SK[A-F0-9]{20}$"
},
"nextAction": {
"enum": [
"pay_with_stripe_cli",
"check_status",
"contact_support",
"expired",
"complete"
],
"type": "string"
},
"amountCents": {
"type": "integer"
},
"orderStatus": {
"enum": [
"open",
"expired",
"fulfilled",
"review_required"
],
"type": "string"
},
"instructions": {
"anyOf": [
{
"type": "object",
"required": [
"recipient",
"amount",
"currency",
"memo",
"flags"
],
"properties": {
"memo": {
"type": "string"
},
"flags": {
"type": "array",
"items": {
"type": "string",
"const": "--agent"
}
},
"amount": {
"type": "string"
},
"currency": {
"type": "string",
"const": "usd"
},
"recipient": {
"type": "string",
"const": "@scorekeeper"
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"paymentStatus": {
"enum": [
"pending",
"received",
"reversed",
"review_required"
],
"type": "string"
},
"accessExpiresAt": {
"type": [
"number",
"null"
]
},
"pollAfterSeconds": {
"type": "integer"
},
"fulfillmentStatus": {
"enum": [
"pending",
"fulfilled",
"review_required"
],
"type": "string"
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}create_scoreboard — Create a scoreboard
Create a public, shareable two-team scoreboard at zero. Requires explicit user intent to create; title and team names are public. Free boards allow 50 total spectator views and show branding. Retry the identical requestId and input after a timeout.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"requestId",
"title",
"teams"
],
"properties": {
"teams": {
"type": "array",
"items": [
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"$ref": "#/properties/title"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"$ref": "#/properties/title"
}
},
"additionalProperties": false
}
],
"maxItems": 2,
"minItems": 2
},
"title": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"requestId": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{8,128}$"
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id",
"title",
"teams",
"revision",
"links",
"limits",
"capabilities"
],
"properties": {
"id": {
"type": "string"
},
"links": {
"type": "object",
"required": [
"spectator",
"manage",
"overlay"
],
"properties": {
"manage": {
"type": [
"string",
"null"
]
},
"overlay": {
"type": "string"
},
"spectator": {
"type": "string"
}
},
"additionalProperties": false
},
"teams": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"score"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"score": {
"type": "number"
}
},
"additionalProperties": false
}
},
"title": {
"type": "string"
},
"limits": {
"type": "object",
"required": [
"spectatorViews",
"watermark"
],
"properties": {
"watermark": {
"type": "boolean"
},
"spectatorViews": {
"type": [
"number",
"null"
]
}
},
"additionalProperties": false
},
"revision": {
"type": "string"
},
"capabilities": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}get_scoreboard — Read a scoreboard
Read a scoreboard created through this API by the connected account, including stable team IDs and current revision.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,128}$"
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id",
"title",
"teams",
"revision",
"links",
"limits",
"capabilities"
],
"properties": {
"id": {
"type": "string"
},
"links": {
"type": "object",
"required": [
"spectator",
"manage",
"overlay"
],
"properties": {
"manage": {
"type": [
"string",
"null"
]
},
"overlay": {
"type": "string"
},
"spectator": {
"type": "string"
}
},
"additionalProperties": false
},
"teams": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"score"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"score": {
"type": "number"
}
},
"additionalProperties": false
}
},
"title": {
"type": "string"
},
"limits": {
"type": "object",
"required": [
"spectatorViews",
"watermark"
],
"properties": {
"watermark": {
"type": "boolean"
},
"spectatorViews": {
"type": [
"number",
"null"
]
}
},
"additionalProperties": false
},
"revision": {
"type": "string"
},
"capabilities": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": false
}list_scoreboards — List scoreboards
List the connected account's API-created generic scoreboards. Does not list unrelated legacy boards. Pass nextCursor as cursor to continue until null; a filtered page can be empty.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1
},
"cursor": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,128}$"
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"scoreboards",
"nextCursor"
],
"properties": {
"nextCursor": {
"type": [
"string",
"null"
]
},
"scoreboards": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"title",
"teams",
"revision",
"links",
"limits",
"capabilities"
],
"properties": {
"id": {
"type": "string"
},
"links": {
"type": "object",
"required": [
"spectator",
"manage",
"overlay"
],
"properties": {
"manage": {
"type": [
"string",
"null"
]
},
"overlay": {
"type": "string"
},
"spectator": {
"type": "string"
}
},
"additionalProperties": false
},
"teams": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"score"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"score": {
"type": "number"
}
},
"additionalProperties": false
}
},
"title": {
"type": "string"
},
"limits": {
"type": "object",
"required": [
"spectatorViews",
"watermark"
],
"properties": {
"watermark": {
"type": "boolean"
},
"spectatorViews": {
"type": [
"number",
"null"
]
}
},
"additionalProperties": false
},
"revision": {
"type": "string"
},
"capabilities": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": false
}update_scoreboard — Update a scoreboard
Atomically set exact scores, increment scores, rename teams or change title. Use stable team IDs and the last read revision. Updates immediately appear publicly. On revision_conflict read the board and decide again; do not blindly replay a stale increment. Identical retry IDs return the previous result.
{
"type": "object",
"properties": {}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id",
"title",
"teams",
"revision",
"links",
"limits",
"capabilities"
],
"properties": {
"id": {
"type": "string"
},
"links": {
"type": "object",
"required": [
"spectator",
"manage",
"overlay"
],
"properties": {
"manage": {
"type": [
"string",
"null"
]
},
"overlay": {
"type": "string"
},
"spectator": {
"type": "string"
}
},
"additionalProperties": false
},
"teams": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"score"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"score": {
"type": "number"
}
},
"additionalProperties": false
}
},
"title": {
"type": "string"
},
"limits": {
"type": "object",
"required": [
"spectatorViews",
"watermark"
],
"properties": {
"watermark": {
"type": "boolean"
},
"spectatorViews": {
"type": [
"number",
"null"
]
}
},
"additionalProperties": false
},
"revision": {
"type": "string"
},
"capabilities": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}hand_off_scoreboard — Hand scoreboard to a person
Return the connected account owner’s private management link. Share it only with the intended scorer, never spectators. Does not transfer ownership. Reuse requestId on retry.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id",
"requestId"
],
"properties": {
"id": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,128}$"
},
"requestId": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{8,128}$"
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url",
"expiresAt",
"transfersOwnership"
],
"properties": {
"url": {
"type": "string"
},
"expiresAt": {
"type": [
"number",
"null"
]
},
"transfersOwnership": {
"type": "boolean"
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}Prompts
Not advertised
Resources
Not advertised
90-day uptime
A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.
- 2026-11-02: 3 of 3 checks answered
- 2026-11-03: 4 of 4 checks answered
- 2026-11-04: 1 of 1 checks answered
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 1653 ms
- 95th percentile latency
- 1653 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · repository · passed · metadata changed · updated
- · backfill · recorded · Pre-expansion baseline; unobserved rich metadata remains unknown
- · probe · passed · 1653 ms · metadata changed · 11 tool(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http scorekeeper-mcp https://www.scorekeeper.co/api/mcpCodex
codex mcp add scorekeeper-mcp --url https://www.scorekeeper.co/api/mcpCursor
{
"mcpServers": {
"scorekeeper-mcp": {
"url": "https://www.scorekeeper.co/api/mcp"
}
}
}Cline
{
"mcpServers": {
"scorekeeper-mcp": {
"type": "streamableHttp",
"url": "https://www.scorekeeper.co/api/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"scorekeeper-mcp": {
"type": "http",
"url": "https://www.scorekeeper.co/api/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http scorekeeper-mcp https://www.scorekeeper.co/api/mcpClaude Desktop
https://www.scorekeeper.co/api/mcpWindsurf
{
"mcpServers": {
"scorekeeper-mcp": {
"serverUrl": "https://www.scorekeeper.co/api/mcp"
}
}
}Let your agent find its tools
Find servers like Scorekeeper MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other productivity and knowledge servers
Do you run Scorekeeper MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.