Skip to main content
Glama
README.md
# sparkit-mcp

MCP server for [SPARKIT](https://sparkit.science) — call the scientific
research agent from Claude Desktop, Cursor, Claude Code, or any other
MCP-compatible client.

Two tools are exposed:

- **`research`** — submit a scientific question. SPARKIT searches the
  literature, reads the relevant papers, and returns a cited Markdown
  report. Blocks until the job finishes (default 4 min) and returns the
  full report inline.
- **`get_job_status`** — fetch a previously-submitted job by id. Useful
  when `research` returned before the job finished, or to revisit a
  past report.

## Install

```bash
uv tool install sparkit-mcp
```

Or with pip:

```bash
pip install sparkit-mcp
```

Either installs a `sparkit-mcp` console script. (Pre-release: install
straight from GitHub with
``uv tool install "git+https://github.com/SPARKIT-science/sparkit-mcp.git"``
until the first PyPI release lands.)

## Get an API key

1. Sign up at https://app.sparkit.science/signup (Try-it costs $10 for
   5 queries; subscriptions start at $50/mo).
2. Visit https://app.sparkit.science/keys and create a key.
3. Copy the key — it's shown only once.

## Configure your MCP client

### Claude Desktop

Edit `claude_desktop_config.json`:

- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`

Add:

```json
{
  "mcpServers": {
    "sparkit": {
      "command": "sparkit-mcp",
      "env": {
        "SPARKIT_API_KEY": "sk_sparkit_..."
      }
    }
  }
}
```

Restart Claude Desktop. You should see `sparkit` appear in the tools
icon next to the chat input.

If `sparkit-mcp` isn't on Claude Desktop's PATH (common with `uv tool`),
use the absolute path:

```json
"command": "/Users/you/.local/bin/sparkit-mcp"
```

(Find the path with `which sparkit-mcp` after `uv tool install`.)

### Cursor

Edit `~/.cursor/mcp.json` (or `.cursor/mcp.json` in your project):

```json
{
  "mcpServers": {
    "sparkit": {
      "command": "sparkit-mcp",
      "env": {
        "SPARKIT_API_KEY": "sk_sparkit_..."
      }
    }
  }
}
```

Reload Cursor (`Cmd+Shift+P` → "Reload Window").

### Claude Code

```bash
claude mcp add sparkit -e SPARKIT_API_KEY=sk_sparkit_... -- sparkit-mcp
```

## Try it

Once configured, ask the LLM:

> Use SPARKIT to look up the most recent literature on the role of
> WRNIP1 as a synthetic-lethal target in cancer.

The LLM will call `research`. Expect a 60-180s wait, then a Markdown
report with inline citations and a numbered Sources list.

## Configuration

| Env var                       | Default                                              | Description |
|-------------------------------|------------------------------------------------------|-------------|
| `SPARKIT_API_KEY`             | (required)                                           | Bearer key from https://app.sparkit.science/keys. |
| `SPARKIT_API_BASE`            | `https://jlsteenwyk--sparkit-api-web.modal.run`      | Override the API base URL. Useful for staging or self-hosted deployments. |
| `SPARKIT_API_TIMEOUT_SECONDS` | `30`                                                 | Per-HTTP-request timeout. Doesn't affect total wait time for `research`; that's `max_wait_seconds`. |

## Tool reference

### `research(question, response_format?, include_citations?, max_wait_seconds?)`

| Arg                | Type                | Default | Description |
|--------------------|---------------------|---------|-------------|
| `question`         | string              | —       | The scientific question. Required. Be specific. |
| `response_format`  | `"full"` or `"brief"` | `"full"` | Length of the returned Markdown report. |
| `include_citations`| boolean             | `true`  | Keep `true` for sourced reports. |
| `max_wait_seconds` | int (30-540)        | `240`   | How long to block waiting before returning the job_id with instructions to poll. |

Returns Markdown. On timeout, returns a status line with the job_id so
the LLM can call `get_job_status` later.

### `get_job_status(job_id)`

Returns the cited Markdown report if the job has completed, a status
line if it's still running, or an error message otherwise.

## Troubleshooting

**Authentication failed** — `SPARKIT_API_KEY` isn't set or is invalid.
Check `claude_desktop_config.json` for typos; restart Claude Desktop
after edits.

**Quota exhausted** — out of monthly queries / Try-it credits. Visit
https://app.sparkit.science/billing.

**Tool isn't appearing in Claude Desktop** — check the Claude Desktop
log:
- macOS: `~/Library/Logs/Claude/mcp-server-sparkit.log`
- Windows: `%LOCALAPPDATA%\Claude\Logs\mcp-server-sparkit.log`

The most common issue is `command: sparkit-mcp` not being on PATH;
substitute the absolute path from `which sparkit-mcp`.

**Job times out** — `max_wait_seconds` cap is 540s (9 min). For very
deep questions, submit then poll `get_job_status` instead of waiting
inline. SPARKIT will also auto-cancel jobs that exceed its own
internal limit.

## License

MIT.

TDQS

A4.5/5.0

Scored across 2 tools

Disambiguation5/5

The two tools have clearly distinct purposes: 'research' submits a scientific question and returns either a report or a job ID, while 'get_job_status' retrieves the status or result of a previously submitted job. There is no overlap in functionality.

Naming Consistency4/5

Both tool names use snake_case, but 'research' is a single-word noun while 'get_job_status' follows a verb_noun pattern. This minor inconsistency prevents a perfect score.

Tool Count4/5

With only two tools, the server covers the essential workflow of submitting a research job and checking its status. While minimal, the count is appropriate for the narrow scope of a scientific research agent.

Completeness3/5

The tool set covers the primary use case (submit and retrieve results), but lacks features like job listing, cancellation, or retry. For a simple agent this may suffice, but there are notable gaps in lifecycle management.

Maintenance

ActivityInactive
ResponsivenessNo issues