# Spark - AI Assets Marketplace

> Search and fetch AI agents, skills, prompts and MCP connectors from the Spark marketplace.

- name: io.github.entire-vc/spark
- version: 4.0.4
- connection class: R0 (autonomous)
- trust: 97/100
- quality: 73/100 (needs work)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/io.github.entire-vc%2Fspark
- tools: https://api.protogrid.dev/v1/servers/io.github.entire-vc%2Fspark/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "spark": {
      "type": "http",
      "url": "https://spark.entire.vc/mcp/",
      "headers": {
        "X-API-Key": "${X_API_KEY}"
      }
    }
  }
}
```

Placeholders to fill: `${X_API_KEY}`.

## Trust

- hygiene: 100
- liveness: 100
- freshness: 100
- provenance: 90
- drivers: +repository +namespace-matches-repo +website +reachable +uptime-100% +updated-14d-ago
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 73/100 (needs work)

### protocol: 88 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- warn `protocol.list_ttl`: tools/list declares ttlMs 0, so clients re-fetch it on every use

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 86 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 6 of 6 tools declare readOnlyHint or destructiveHint
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: list_categories (destructiveHint); get_asset (destructiveHint); report_outcome (openWorldHint); …
- pass `tools.token_cost`: about 1,973 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 25 (weight 15)

- warn `stability.changes`: 18 tool changes in 30 days
- fail `stability.rug_pull`: 12 tools kept their name but changed most of their description in 30 days; review before trusting them

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 6, about 1,973 tokens to load them all
- tool set hash: 240c9dfb3c0a8b6f93d4ae734e412f9b
- tools last changed: 2026-10-02T13:51:00.330Z
- badge: [![protogrid quality](https://protogrid.dev/badge/io.github.entire-vc/spark.svg)](https://protogrid.dev/servers/io.github.entire-vc/spark)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-10-02 `list_categories` changed (description) **meaning changed**
  - before: List available categories (domains and AI tags) in the Spark marketplace. Returns the domain slugs that search_assets accepts as its `domain` filter, and the AI tags, as a taxonomy of the catalog. Example: list_categories()
  - after: List available categories (domains and AI tags) in the Spark marketplace. For when domain filter values or taxonomy are needed; search_assets returns assets rather than categories. Takes no parameters. Returns Markdown lists of AI tag names/slugs and domain names/slugs grouped by parent category; domain slugs are accepted by search_assets' domain filter. AI tags are not a search_assets filter. Public catalog lookup, no login or download recorded. For example, list_categories().
- 2026-10-02 `list_popular` changed (description, inputSchema) **meaning changed**
  - before: List the most popular Spark assets by download count, optionally filtered by type. Takes no search text; it returns the current top of the catalog by downloads.
  - after: List the most popular Spark assets by download count, optionally filtered by type. For when browsing without a text query; search_assets finds text matches. Returns numbered summaries with outcomes, price, tags and URLs, or 'No assets found.' Downloads measure acquisitions, not successful applications or ratings. Public catalog lookup, no login or download recorded. For example, list_popular(type='skill', limit=5).
- 2026-10-02 `report_outcome` changed (description, inputSchema)
  - before: Records the result of applying an asset that was fetched with get_asset_content: applied as is, applied with changes, broke, or not applicable. The report is tied to the application_id that get_asset_content returned; submitting the same application_id again updates the report. Reports made with an API key are counted; anonymous ones are stored as unverified. Fields `task`, `note`, `changed_what`, `failed_at`, `expected`, `got` are published on the asset's public page on spark.entire.vc, visible to any visitor. Do not include client data, private paths, keys, emails or URLs with tokens. Your identity is never shown on that page. Example: report_outcome(application_id='<from get_asset_content>', result='applied_with_changes', task='add a rate limiter to the API', changed_what='swapped the fixed window for a token bucket').
  - after: Records the result of applying a fetched Spark asset: applied as is, changed, broke, or not applicable. For when the outcome is known and an application_id from get_asset_content is available, rather than a star rating. Mismatched user/session receipts are rejected; asset owners cannot report on their own assets. Submitting the same application_id updates the report. Authenticated reports count, but team reports do not affect rankings; anonymous reports are unverified. Returns a saved/updated confirmation, or a validation/receipt error. Fields `task`, `note`, `changed_what`, `failed_at`, `expected`, `got` are published on the asset's public page on spark.entire.vc, visible to any visitor. Do not include client data, private paths, keys, emails or URLs with tokens. Your identity is never shown on that page. Example: report_outcome(application_id='<receipt>', result='applied_as_is', task='add a rate limiter').
- 2026-10-02 `get_asset_content` changed (description, inputSchema) **meaning changed**
  - before: Get the raw content of a Spark asset (prompt text, skill instructions, agent config) — the actual text to apply, not just a description of it. Takes a slug. Unlike search_assets and get_asset, this counts as a download/acquisition event, and each call may return different content if the asset was updated. Paid assets require authentication: a Spark API key (X-API-Key header) or a Bearer token in the MCP client configuration. The response ends with an `application_id` line that identifies this fetch; report_outcome takes it as its `application_id` argument.
  - after: Get the raw content of a Spark asset (prompt text, skill instructions, agent config) — the actual text to apply, not just a description of it. For when a known asset's content is needed for application; get_asset provides details without acquisition. Each successful fetch records a download/acquisition; repeated calls create new receipts and content may change after updates. Free content needs no login. Paid content requires a Spark API key (X-API-Key) or Bearer token and prior purchase or ownership; this tool makes no purchase. Returns content and an application_id for report_outcome, or a not-found/access message. Content may be a source link rather than embedded text. For example, get_asset_content(slug='vb-seo-expert').
- 2026-10-02 `get_asset` changed (description, inputSchema) **meaning changed**
  - before: Get full details of a Spark asset by its slug — description, metadata, outcome reports, bundled files and the URL on spark.entire.vc. Takes a slug, for example from a search result, a popular list or a link. Returns the full picture of the asset. It does not return the prompt/skill/agent text itself; get_asset_content returns that.
  - after: Get full details of a Spark asset by its slug — description, metadata, outcome reports, bundled files and the URL on spark.entire.vc. For when a known slug needs inspection before acquisition. Returns Markdown details, which may include embedded content; get_asset_content obtains the raw content and a receipt. Public catalog lookup, no login or download recorded. Missing or unavailable slugs return a not-found message. For example, get_asset(slug='vb-seo-expert').
- 2026-10-02 `search_assets` changed (description, inputSchema) **meaning changed**
  - before: Search the Spark AI assets marketplace for agents, skills, prompts, prompt chains, MCP connectors and bundles. Finds assets by text query, for when the slug is not known. Returns a numbered list of short summaries: title, type, downloads, outcome summary, price, tags and the asset's URL on spark.entire.vc.
  - after: Search the Spark AI assets marketplace for agents, skills, prompts, prompt chains, MCP connectors and bundles. For when a text query is available but the slug is not known; get_asset describes a known slug. Returns numbered summaries with type, downloads, outcomes, price, tags and URL, or a no-results message. No login required; no acquisition is made. Unmatched nonempty queries may be recorded as unmet catalog needs. A nonempty job ranks text matches by task fit, even with a non-combo sort. For example, search_assets(query='rate limiting', job='add a rate limiter', limit=5).
- 2026-09-25 `list_categories` changed (description) **meaning changed**
  - before: List available categories (domains and AI tags) in the Spark marketplace. Call this to discover valid values for search_assets' `domain` filter, or to browse the catalog's taxonomy before searching. Example: list_categories()
  - after: List available categories (domains and AI tags) in the Spark marketplace. Returns the domain slugs that search_assets accepts as its `domain` filter, and the AI tags, as a taxonomy of the catalog. Example: list_categories()
- 2026-09-25 `list_popular` changed (description) **meaning changed**
  - before: List the most popular Spark assets by download count, optionally filtered by type. Use this to browse what's trending when you don't have a specific search term — for a targeted lookup, use search_assets instead.
  - after: List the most popular Spark assets by download count, optionally filtered by type. Takes no search text; it returns the current top of the catalog by downloads.
- 2026-09-25 `report_outcome` changed (description, inputSchema)
  - before: Report what happened when you applied an asset you fetched with get_asset_content. Call it once you know: applied as is, applied with changes, broke, or not applicable. The next agent choosing this asset reads the outcomes in search results. Reports made with an API key count; anonymous ones are stored as unverified. Calling again with the same application_id updates your report. Fields `task`, `note`, `changed_what`, `failed_at`, `expected`, `got` are shown to the asset's author. Do not include client data, private paths, keys, emails or URLs with tokens. Your identity is never shown to the author. Example: report_outcome(application_id='<from get_asset_content>', result='applied_with_changes', task='add a rate limiter to the API', changed_what='swapped the fixed window for a token bucket').
  - after: Records the result of applying an asset that was fetched with get_asset_content: applied as is, applied with changes, broke, or not applicable. The report is tied to the application_id that get_asset_content returned; submitting the same application_id again updates the report. Reports made with an API key are counted; anonymous ones are stored as unverified. Fields `task`, `note`, `changed_what`, `failed_at`, `expected`, `got` are published on the asset's public page on spark.entire.vc, visible to any visitor. Do not include client data, private paths, keys, emails or URLs with tokens. Your identity is never shown on that page. Example: report_outcome(application_id='<from get_asset_content>', result='applied_with_changes', task='add a rate limiter to the API', changed_what='swapped the fixed window for a token bucket').
- 2026-09-25 `get_asset_content` changed (description)
  - before: Get the raw content of a Spark asset (prompt text, skill instructions, agent config) — the actual text to apply, not just a description of it. Call this once you've picked a slug (via search_assets/get_asset) and are ready to use the asset. Unlike search_assets/get_asset, this counts as a download/acquisition event, and each call may return different content if the asset was updated. For paid assets, authentication is required — add your Spark API key (X-API-Key header) or a Bearer token to your MCP client configuration. The response ends with an `application_id`; pass it to report_outcome once you know whether the asset worked.
  - after: Get the raw content of a Spark asset (prompt text, skill instructions, agent config) — the actual text to apply, not just a description of it. Takes a slug. Unlike search_assets and get_asset, this counts as a download/acquisition event, and each call may return different content if the asset was updated. Paid assets require authentication: a Spark API key (X-API-Key header) or a Bearer token in the MCP client configuration. The response ends with an `application_id` line that identifies this fetch; report_outcome takes it as its `application_id` argument.

Full history: https://api.protogrid.dev/v1/servers/io.github.entire-vc%2Fspark/changes

## Remotes

- https://spark.entire.vc/mcp/ (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

_none_

## Tools (6)

- `get_asset`: Get full details of a Spark asset by its slug — description, metadata, outcome
reports, bundled files and the URL on spark.entire.vc.

For when a known slug needs inspection before acquisition. Returns Markdown
details, which may include embedded content; get_asset_content obtains the raw
content and a receipt. Public catalog lookup, no login or download recorded.
Missing or unavailable slugs return a not-found message.

For example, get_asset(slug='vb-seo-expert').
- `get_asset_content`: Get the raw content of a Spark asset (prompt text, skill instructions, agent config) —
the actual text to apply, not just a description of it.

For when a known asset's content is needed for application; get_asset provides
details without acquisition. Each successful fetch records a download/acquisition;
repeated calls create new receipts and content may change after updates.
Free content needs no login. Paid content requires a Spark API key (X-API-Key)
or Bearer token and prior purchase or ownership; this tool makes no purchase.
Returns content and an application_id for report_outcome, or a not-found/access
message. Content may be a source link rather than embedded text.

For example, get_asset_content(slug='vb-seo-expert').
- `list_categories`: List available categories (domains and AI tags) in the Spark marketplace.

For when domain filter values or taxonomy are needed; search_assets returns
assets rather than categories. Takes no parameters. Returns Markdown lists
of AI tag names/slugs and domain names/slugs grouped by parent category;
domain slugs are accepted by search_assets' domain filter. AI tags are not a
search_assets filter. Public catalog lookup, no login or download recorded.

For example, list_categories().
- `list_popular`: List the most popular Spark assets by download count, optionally filtered by type.

For when browsing without a text query; search_assets finds text matches.
Returns numbered summaries with outcomes, price, tags and URLs, or 'No assets
found.' Downloads measure acquisitions, not successful applications or ratings.
Public catalog lookup, no login or download recorded.

For example, list_popular(type='skill', limit=5).
- `report_outcome`: Records the result of applying a fetched Spark asset: applied as is, changed, broke, or not applicable. For when the outcome is known and an application_id from get_asset_content is available, rather than a star rating. Mismatched user/session receipts are rejected; asset owners cannot report on their own assets. Submitting the same application_id updates the report. Authenticated reports count, but team reports do not affect rankings; anonymous reports are unverified. Returns a saved/updated confirmation, or a validation/receipt error.

Fields `task`, `note`, `changed_what`, `failed_at`, `expected`, `got` are published on the asset's public page on spark.entire.vc, visible to any visitor. Do not include client data, private paths, keys, emails or URLs with tokens. Your identity is never shown on that page.

Example: report_outcome(application_id='<receipt>', result='applied_as_is', task='add a rate limiter').
- `search_assets`: Search the Spark AI assets marketplace for agents, skills, prompts, prompt chains, MCP connectors and bundles.

For when a text query is available but the slug is not known; get_asset describes
a known slug. Returns numbered summaries with type, downloads, outcomes, price,
tags and URL, or a no-results message. No login required; no acquisition is made.
Unmatched nonempty queries may be recorded as unmet catalog needs. A nonempty
job ranks text matches by task fit, even with a non-combo sort.

For example, search_assets(query='rate limiting', job='add a rate limiter', limit=5).
