Skeletable

io.github.eftpmcPublished by GitHub account eftpmcv1.0.0Updated Nov 3, 2026

Source-backed public tables with citations, claim checks, and reviewable corrections.

VerifiedStreamable HTTPWeb executable

Overview

Skeletable's hosted MCP server (skeletable.com); no sign-in required; Streamable HTTP; 16 tools.

No AI overview yet: these facts come from the registry entry and the server itself.

Endpoint
skeletable.com
Last checked

Installation

In SourceWeft

  1. Open Skeletable in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.eftpmc%2Fskeletable/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "skeletable": {
      "type": "http",
      "url": "https://skeletable.com/mcp"
    }
  }
}

README

Skeletable

Tables for people and agents, where every value records where it came from: a linked page, a person, a file or another app, or a model. Use one for a tracker, a dataset or a list. A new table works this way by default. A table can also require proof, as every table in the public library does: then each value links to the source and exact words that state it, or says where we looked. People read tables on the site, and agents read and build them through an MCP server.

Connect

The server takes MCP over HTTP at /mcp. Reading needs no account. Proposing a change or building a draft needs a token from Settings, sent as a Bearer token. An agent can only write to drafts its person runs, each value still passes every check, and a person publishes.

sh
claude mcp add --transport http skeletable https://skeletable.com/mcp
ToolWhat it does
list_tablesFind a table by what it covers
get_tableRead a table: its scope, columns, a summary of each column, and its rows, live or as a saved version
get_cellOne value's source, exact quote and date, or where we looked
check_claimTest a statement against a cell: it matches, differs, is disputed, or is unknown
export_tableA table as CSV, live or a saved version, with chosen columns, and optionally each value's source, quote and origin
propose_changeSuggest a new value with its proof, for the owner to review
create_tableMake a private draft, ready to fill. proof: "optional" makes one for working data
add_columnsAdd columns to a draft, including AI columns with an instruction
add_rowsAdd up to 500 rows a call, each by name or with its values. A row it already has gets the new values
fill_cellsFill a draft's cells with proof, or say where you looked. Where proof is optional, a value can give its origin instead. Replies list only what failed
data_linkA private CSV address for a notebook, script or spreadsheet, with the lines to load it
save_versionFreeze a table as a numbered version with a link that never changes
fork_tableCopy a public table, or one you run, into your account as a private draft
set_instructionMake a column an AI column, change its instruction, or clear it
next_ai_cellsThe next prompts for a table's AI columns, each with a fingerprint
fill_ai_cellsSave the agent's answers to an AI column

Datasets

A table whose proof is optional is a dataset. Its values say where they came from: a linked page, a person, a file, or a model. On top of that:

  • AI columns have an instruction, like Classify {Pitch} as Horror, Puzzle or Racing. The person's own agent answers it for each row through next_ai_cells and fill_ai_cells, so Skeletable never runs a model itself. Each answer records the model and a fingerprint of its prompt, so a changed row shows its answer is out of date. A value a person typed is never overwritten.
  • Versions freeze a table with a lasting link, at /owner/slug/v/2 and, for a public table, /data/owner/slug/v2.csv.
  • Column summaries show what each column holds: categories with counts, text lengths, number ranges, and where values came from.
  • Data links at /d/<key>.csv load a private table into pandas or Google Sheets. ?columns=a,b picks columns and ?names=0 drops row names.
  • Forks copy a public table into your account to extend or relabel, and remember where they came from.

What's here

tables/          The tables, how they're scored, and their check resultspackages/tables  The table format and its checksapps/mcp         The server: the MCP endpoint and the JSON the site readsapps/web         The site, built with shadcn/ui and served by the serverdocker/          The server's image, which Railway builds

Licensing

The source code is licensed under Apache-2.0. Published table data is licensed separately under CC BY 4.0, as shown in the data responses.

Review table changes

Each table has Overview, Proposals, and History tabs, with an Open sheet button for the editor. Signed-in contributors can create a titled proposal with up to 20 cell changes, a reason, and a source and exact quote for each value. Bundles remain open for review, including when submitted by an owner. Existing single-cell owner saves still apply immediately after validation.

Account owners and editors can accept all changes in a bundle or close it. Acceptance is transactional and refuses a bundle if any cell has a newer version than the one recorded at submission. Close a stale proposal and submit an updated one. Accepted values remain in the existing version history. Discussion threads, revision restore, and editing an open proposal are not implemented yet.

Develop

Requirements: Node 22+ and pnpm 10 (corepack enable).

sh
pnpm installpnpm dev
CommandWhat it does
pnpm devRun the server on port 4200
pnpm dev:webRun the site on port 5173, reading from that server
pnpm testRun tests
pnpm lintLint
pnpm typecheckType-check every package
pnpm buildProduction build
pnpm tables validate <file>Check a table's shape, numbers and text against its quotes
pnpm tables verify <file>Open each source and look for every quote
pnpm tables watch <file>See whether live quotes are still on their pages, and save the result
pnpm tables sample <file>Draw a repeatable sample of cells for spot-checking

New tables start as JSON files in tables/, and the server loads them into Postgres when DATABASE_URL is set, or serves them directly when it isn't. It refuses to start if a table fails its checks.

Sign-in needs DATABASE_URL, GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET. PUBLIC_URL sets the site's address, and OWNER_EMAIL says who runs the official account.

Database tests run when TEST_DATABASE_URL is set. They wipe that database.

Source: README.md at commit dcc1701

Tools

16

list_tables

Find tables in the library. Each result gives its slug, the question it answers, its size and when it was last read.

Parametersquery

get_table

Read a table: its scope, its columns with the rule for each, a summary of what each column holds, and its rows. A null value is blank. `origins` says where a row's unquoted values came from, `ai` says how far each AI column has got, and `versions` lists saved versions. For a big table, read the summaries first and page through rows with `offset` and `limit`.

Parametersslugrequiredlimitoffsetversion

get_cell

The evidence for one value: the source, the exact quote, what kind of source it is and when it was read. For a missing value, where we looked, and `absent` means the source was read and gives no such value. `url` is the cell's lasting address, showing its proof, for citing. `confirmed` says how a second reader backed it up, and without it the value has been read once. `conflicts` lists sources that state something else, `history` lists past values, and `watch` says whether the quote was still on its page at the last check.

Parametersrowrequiredslugrequiredcolumnrequired

check_claim

Test a statement against one cell, such as whether a value in a draft or an answer is right. The verdict is `matches`, `differs` (with what the source states), `disputed` (sources disagree, see `conflicts`) or `unknown` (no acceptable source stated it, so say so). It compares values and doesn't judge meaning, so read the quote before relying on a text verdict. Use list_tables and get_table to find the cell first.

Parametersrowrequiredslugrequiredvaluerequiredcolumnrequired

export_table

A table as CSV, ready to save as a file or load into a notebook. The first column is each row's name unless `names` is false. `columns` picks columns by id, in that order. With `proof`, each column is followed by its source and quote, and in a table whose proof is optional, by where each value came from. An empty field means no value.

Parametersslugrequirednamesproofcolumnsversion

propose_change

Suggest a new value for a cell, with its proof. The quote must be word for word from the source and state the value. The owner reviews it before anything changes. Needs a token sent as a Bearer token.

Parametersrowrequirednoteslugrequiredquoterequiredvaluerequiredcolumnrequiredsourcerequired

create_table

Make a private draft table, ready to fill, for anything from a tracker to a dataset. Its values say where they came from unless you set `proof` to `required`. Only `title`, `columns` and `rows` are needed now, but give `question`, `scope`, and a `rule` for each column if you can: a person has to supply them before publishing. Returns the column ids fill_cells needs, and the sheet's link, so tell your person to open it and watch it fill. Needs a token.

Parametersrowsownerproofscopetitletopiccolumnsquestiontemplate

add_columns

Add columns to a draft you run, such as a blank one a person started. Returns the new column ids for fill_cells. Needs a token.

Parametersslugrequiredcolumnsrequired

add_rows

Add up to 500 rows to a table you run. Each row is a name, or an object with its `values` by column id or label, so a whole tracker or dataset goes in a few calls. A row without a `key` gets the next free number. A name the table already has gets the values given for it, so syncing again from the same source is one call; with no values it's skipped. Say where the values came from with `origin` (`entered`, `imported` with a `note` naming the file or email, `link` with a `source`, or `generated`, which is the default without a source). Rows with values can go into a published table too; rows by name only into a draft. A table that requires proof takes rows by name only. Needs a token.

Parametersrowsrequiredslugrequired

fill_cells

Set up to 200 cells of a table you run. Usually a cell gives `value` and `origin` (`entered`, `imported` with a `note` like the file or email it came from, `link` with its `source`, or `generated`). Left out, the origin is `link` when there's a `source` and `generated` when there isn't. These can go into a published table too, and never replace a quoted value. A date is written YYYY-MM-DD, and a column with choices takes only one of them. In a table that requires proof, a cell instead gives `value`, `source` and `quote`, word for word from the source; each page is opened before it's saved, so send at most 25 of these at once, and only into a draft. If no acceptable source states it, give `checked` with the pages you read, and `none_stated` only if you read the whole source and it has no such value. The reply counts what saved and lists only the cells that didn't, with a reason, and `unchecked` names quoted values whose page couldn't be read. Needs a token.

Parametersslugrequiredcellsrequired

save_version

Freeze a table you run as it stands now, as a numbered version with a lasting link that never changes. Do this before training on a dataset or citing a table, and name the version you used. Needs a token.

Parametersnoteslugrequired

fork_table

Copy a table into your own account as a private draft, to extend or relabel: any published public table, or one you run. Every value keeps its proof or origin, and the copy remembers where it came from. Needs a token.

Parametersslugrequiredownertitle

set_instruction

Make a column an AI column, change its instruction, or turn it back into a plain column with an empty one. The instruction says what to work out for each row and names other columns in braces, like "Classify {Pitch} by genre". Its values never overwrite what a person typed, linked or quoted. Needs proof to be optional and a token.

Parametersslugrequiredcolumnrequiredchoicesinstructionrequired

next_ai_cells

The next prompts to answer for a table's AI columns, up to 200 at a time: blank cells first, then answers whose row or instruction has changed. Answer each prompt yourself, then send the answers back with fill_ai_cells, each with its `row` and `basis`. Repeat until it says `done`. `redo` also re-answers generated values that came from outside the instruction. Needs a token.

Parametersredoslugrequiredlimitcolumn

fill_ai_cells

Save up to 200 answers to an AI column, each with the `row` and `basis` next_ai_cells gave it. An answer outside the column's choices, or to a prompt that has since changed, comes back with a reason. Each value is saved as generated, with the instruction and `model`. Needs a token.

Parametersslugrequiredmodelrequiredcolumnrequiredanswersrequired

Version history

1
  1. v1.0.0LatestNov 3, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts