Blockworks serves crypto research and data: documents (search_documents), row datasets (tabular_catalog, tabular_data), metrics over time (timeseries_catalog, timeseries_data) and monitored industry developments (the monitoring tools).
Report friction with submit_feedback as soon as you have a workaround or have given up, before you answer your user. Report it when a call returned an error or an empty or surprising result, when you guessed an identifier or series key, when you needed more than one call to turn a name into a key, or when two models or metrics looked equivalent and you could not tell which to use. You do not need to ask your user first. Include the request_id of each result involved.
Discoverability
0/6 passed0 of 6 passed0/100
Client listings and public setup information.
mcp.json or server-card.json
Either mcp.json or an MCP Server Card declaring this endpoint passes.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
List the intel taxonomy that classifies developments and events.
Call this before passing intelCategories or intelSubcategories to monitoring_developments or
monitoring_events. Those filters take slugs, and a slug that is not in this taxonomy matches
nothing. Do not guess a slug from a category's name.
Takes no arguments and returns every top-level category with its subcategories, each as
{slug, name, description}.
ACCESS: this reads Blockworks' monitoring product, which an account is entitled to separately. A
FORBIDDEN result means this session cannot read it — either the account is not entitled, or its
credential type is not accepted — and the error says which. Either way, relay it and stop: do not
retry, and do not try the other monitoring_* tools for the same user, because they go through the
same gateway and will refuse too.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"required": [
"categories"
],
"properties": {
"categories": {
"type": "array",
"items": {
"type": "object",
"required": [
"slug",
"name",
"subcategories"
],
"properties": {
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"description": {
"type": "string"
},
"subcategories": {
"type": "array",
"items": {
"type": "object",
"required": [
"slug",
"name"
],
"properties": {
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"description": {
"type": "string"
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
},
"description": "Every top-level category with its subcategories"
},
"request_id": {
"type": "string",
"description": "The ID of the request behind this result. Quote it if you report the result with submit_feedback."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "monitoring_categories",
"title": "List monitoring categories",
"description": "List the intel taxonomy that classifies developments and events.\n\nCall this before passing intelCategories or intelSubcategories to monitoring_developments or\nmonitoring_events. Those filters take slugs, and a slug that is not in this taxonomy matches\nnothing. Do not guess a slug from a category's name.\n\nTakes no arguments and returns every top-level category with its subcategories, each as\n{slug, name, description}.\n\nACCESS: this reads Blockworks' monitoring product, which an account is entitled to separately. A\nFORBIDDEN result means this session cannot read it — either the account is not entitled, or its\ncredential type is not accepted — and the error says which. Either way, relay it and stop: do not\nretry, and do not try the other monitoring_* tools for the same user, because they go through the\nsame gateway and will refuse too.",
"inputSchema": {
"type": "object",
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"categories"
],
"properties": {
"categories": {
"type": "array",
"items": {
"type": "object",
"required": [
"slug",
"name",
"subcategories"
],
"properties": {
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"description": {
"type": "string"
},
"subcategories": {
"type": "array",
"items": {
"type": "object",
"required": [
"slug",
"name"
],
"properties": {
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"description": {
"type": "string"
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
},
"description": "Every top-level category with its subcategories"
},
"request_id": {
"type": "string",
"description": "The ID of the request behind this result. Quote it if you report the result with submit_feedback."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List monitoring categories",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Read developments from Blockworks' monitoring coverage of the crypto industry.
A development is one thing that happened in the industry — a product launch, an exchange listing,
a funding round, a governance vote, a security incident — assembled by Blockworks' editorial team
from the public source documents reporting it, and carrying its own title, summary, taxonomy and
editorial labels. It is news coverage of companies, protocols and assets, not information about
individual people. Related developments are grouped into an event; use monitoring_events to read
the story rather than its parts.
Use this tool for "what happened" over a window, for an asset, or in a category, and for the source
documents behind it. Use search_documents instead for explanation and background out of the research
corpus, and tabular_data or timeseries_data for numbers.
THREE WAYS TO READ, chosen by what you pass:
- Nothing extra: the whole corpus, narrowed by the filters you pass.
- monitoringViewId: only what one saved monitoring view matches. The view's own predicates always
apply; your filters narrow further and can never widen past it. Call monitoring_views for the ids.
- monitoringViewId "all": the deduplicated union across every view the caller can see. This route
applies a smaller filter set — minimumImportance, actionable, assetSectors, assetSubsectors,
assetPreTge, assetEcosystemNetworkIds and search — and rejects the rest rather than ignoring them.
- developmentId: that one development by UUID or slug, filters ignored.
FILTERS combine with AND. intelCategories and intelSubcategories take slugs from
monitoring_categories, not names. assetIds takes a UUID, slug or symbol, and a symbol can expand to
several assets. start and end bound the development's own window, not its creation time, and accept
YYYY-MM-DD, RFC3339 or unix seconds — always state a window when the question is time-sensitive.
Returns at most 50 developments, 10 by default, plus totalRows and totalPages for the whole filtered
set: check totalRows before concluding you have seen everything. Each development carries its source
documents as title and url. Cite those, not this tool.
ACCESS: this reads Blockworks' monitoring product, which an account is entitled to separately. A
FORBIDDEN result means this session cannot read it — either the account is not entitled, or its
credential type is not accepted — and the error says which. Either way, relay it and stop: do not
retry, and do not try the other monitoring_* tools for the same user, because they go through the
same gateway and will refuse too.
The description explains the capability, when to use it, and what to expect.
Inputs91/100
Explain the meaning of this value, not just its name.
developmentId
Read this one development by UUID or slug and return it alone. Every filter argument is ignored when it is set.
Clear enough to supply this argument.
monitoringViewId
Scope the read to one saved monitoring view, by UUID or slug-with-id-prefix, as monitoring_views returns it. Pass all for the deduplicated union across every view the caller can see. Omit to read the whole corpus.
Clear enough to supply this argument.
assetIds
Restrict to these assets. Each entry is an asset UUID, slug (bitcoin) or symbol (BTC); a symbol can expand to several assets. A token that matches no asset is dropped, and a filter where none match returns an empty page.
Clear enough to supply this argument.
intelCategories
Restrict to these taxonomy category slugs, exactly as monitoring_categories returns them.
Clear enough to supply this argument.
intelSubcategories
Restrict to these taxonomy subcategory slugs, exactly as monitoring_categories returns them.
Clear enough to supply this argument.
minimumImportance
Lowest editorial importance rating to include: not-important, low, medium or high. Importance is assigned by Blockworks' editors.
Clear enough to supply this argument.
verified
true restricts to analyst-approved records. Omit to include both.
Clear enough to supply this argument.
actionable
true restricts to records Blockworks' editors tagged actionable. Omit to include both.
Clear enough to supply this argument.
governance
true restricts to governance records. Omit to include both.
Clear enough to supply this argument.
assetSectors
Restrict to assets in these sectors.
Clear enough to supply this argument.
assetSubsectors
Restrict to assets in these subsectors.
Clear enough to supply this argument.
assetPreTge
true restricts to pre-TGE assets. Omit to include both.
Clear enough to supply this argument.
assetEcosystemNetworkIds
Restrict to assets in these ecosystem networks, by network id.
Explain the meaning of this value, not just its name.
includeSecondaryAssets
true also matches assets merely mentioned rather than central to the record. Defaults to false, matching only the record's primary assets. Not available on a view-scoped read.
Explain the meaning of this value, not just its name.
eventIds
Restrict to records belonging to these events. Each entry is an event UUID or a slug-with-id-prefix such as aave-v4-launch-a1b2c3d4. A token that resolves to no event fails the call.
Explain the meaning of this value, not just its name.
start
Lower bound on the record's own time window, as YYYY-MM-DD, RFC3339 or unix seconds.
Clear enough to supply this argument.
end
Upper bound on the record's own time window, same formats as start.
Clear enough to supply this argument.
search
Free-text search over titles and summaries, at most 200 characters.
{
"name": "monitoring_developments",
"title": "Read monitored developments",
"description": "Read developments from Blockworks' monitoring coverage of the crypto industry.\n\nA development is one thing that happened in the industry — a product launch, an exchange listing,\na funding round, a governance vote, a security incident — assembled by Blockworks' editorial team\nfrom the public source documents reporting it, and carrying its own title, summary, taxonomy and\neditorial labels. It is news coverage of companies, protocols and assets, not information about\nindividual people. Related developments are grouped into an event; use monitoring_events to read\nthe story rather than its parts.\n\nUse this tool for \"what happened\" over a window, for an asset, or in a category, and for the source\ndocuments behind it. Use search_documents instead for explanation and background out of the research\ncorpus, and tabular_data or timeseries_data for numbers.\n\nTHREE WAYS TO READ, chosen by what you pass:\n- Nothing extra: the whole corpus, narrowed by the filters you pass.\n- monitoringViewId: only what one saved monitoring view matches. The view's own predicates always\n apply; your filters narrow further and can never widen past it. Call monitoring_views for the ids.\n- monitoringViewId \"all\": the deduplicated union across every view the caller can see. This route\n applies a smaller filter set — minimumImportance, actionable, assetSectors, assetSubsectors,\n assetPreTge, assetEcosystemNetworkIds and search — and rejects the rest rather than ignoring them.\n- developmentId: that one development by UUID or slug, filters ignored.\n\nFILTERS combine with AND. intelCategories and intelSubcategories take slugs from\nmonitoring_categories, not names. assetIds takes a UUID, slug or symbol, and a symbol can expand to\nseveral assets. start and end bound the development's own window, not its creation time, and accept\nYYYY-MM-DD, RFC3339 or unix seconds — always state a window when the question is time-sensitive.\n\nReturns at most 50 developments, 10 by default, plus totalRows and totalPages for the whole filtered\nset: check totalRows before concluding you have seen everything. Each development carries its source\ndocuments as title and url. Cite those, not this tool.\n\nACCESS: this reads Blockworks' monitoring product, which an account is entitled to separately. A\nFORBIDDEN result means this session cannot read it — either the account is not entitled, or its\ncredential type is not accepted — and the error says which. Either way, relay it and stop: do not\nretry, and do not try the other monitoring_* tools for the same user, because they go through the\nsame gateway and will refuse too.",
"inputSchema": {
"type": "object",
"properties": {
"end": {
"type": "string",
"description": "Upper bound on the record's own time window, same formats as start."
},
"page": {
"type": [
"null",
"integer"
],
"description": "1-based page number. Defaults to 1."
},
"limit": {
"type": [
"null",
"integer"
],
"description": "Records per page. Defaults to 10, maximum 50."
},
"start": {
"type": "string",
"description": "Lower bound on the record's own time window, as YYYY-MM-DD, RFC3339 or unix seconds."
},
"search": {
"type": "string",
"description": "Free-text search over titles and summaries, at most 200 characters."
},
"assetIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Restrict to these assets. Each entry is an asset UUID, slug (bitcoin) or symbol (BTC); a symbol can expand to several assets. A token that matches no asset is dropped, and a filter where none match returns an empty page."
},
"eventIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Restrict to records belonging to these events. Each entry is an event UUID or a slug-with-id-prefix such as aave-v4-launch-a1b2c3d4. A token that resolves to no event fails the call."
},
"verified": {
"type": [
"null",
"boolean"
],
"description": "true restricts to analyst-approved records. Omit to include both."
},
"actionable": {
"type": [
"null",
"boolean"
],
"description": "true restricts to records Blockworks' editors tagged actionable. Omit to include both."
},
"governance": {
"type": [
"null",
"boolean"
],
"description": "true restricts to governance records. Omit to include both."
},
"assetPreTge": {
"type": [
"null",
"boolean"
],
"description": "true restricts to pre-TGE assets. Omit to include both."
},
"assetSectors": {
"type": "array",
"items": {
"type": "string"
},
"description": "Restrict to assets in these sectors."
},
"developmentId": {
"type": "string",
"description": "Read this one development by UUID or slug and return it alone. Every filter argument is ignored when it is set."
},
"assetSubsectors": {
"type": "array",
"items": {
"type": "string"
},
"description": "Restrict to assets in these subsectors."
},
"intelCategories": {
"type": "array",
"items": {
"type": "string"
},
"description": "Restrict to these taxonomy category slugs, exactly as monitoring_categories returns them."
},
"monitoringViewId": {
"type": "string",
"description": "Scope the read to one saved monitoring view, by UUID or slug-with-id-prefix, as monitoring_views returns it. Pass all for the deduplicated union across every view the caller can see. Omit to read the whole corpus."
},
"minimumImportance": {
"type": "string",
"description": "Lowest editorial importance rating to include: not-important, low, medium or high. Importance is assigned by Blockworks' editors."
},
"intelSubcategories": {
"type": "array",
"items": {
"type": "string"
},
"description": "Restrict to these taxonomy subcategory slugs, exactly as monitoring_categories returns them."
},
"includeSecondaryAssets": {
"type": [
"null",
"boolean"
],
"description": "true also matches assets merely mentioned rather than central to the record. Defaults to false, matching only the record's primary assets. Not available on a view-scoped read."
},
"assetEcosystemNetworkIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Restrict to assets in these ecosystem networks, by network id."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"developments"
],
"properties": {
"pagination": {
"type": [
"null",
"object"
],
"required": [
"limit",
"page",
"totalRows",
"totalPages"
],
"properties": {
"page": {
"type": "integer"
},
"limit": {
"type": "integer"
},
"totalRows": {
"type": "integer"
},
"totalPages": {
"type": "integer"
}
},
"description": "Totals for the whole filtered set. Absent on a single-development read.",
"additionalProperties": false
},
"request_id": {
"type": "string",
"description": "The ID of the request behind this result. Quote it if you report the result with submit_feedback."
},
"developments": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"title",
"verified",
"intelCategories",
"intelSubcategories",
"actionable",
"governance",
"documents",
"assets"
],
"properties": {
"id": {
"type": "string"
},
"slug": {
"type": "string"
},
"event": {
"type": [
"null",
"object"
],
"required": [
"id",
"title",
"developmentCount"
],
"properties": {
"id": {
"type": "string"
},
"slug": {
"type": "string"
},
"title": {
"type": "string"
},
"developmentCount": {
"type": "integer"
}
},
"additionalProperties": false
},
"title": {
"type": "string"
},
"assets": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"slug"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"class": {
"type": "string"
},
"symbol": {
"type": "string"
},
"associatedProjectSlug": {
"type": "string"
}
},
"additionalProperties": false
}
},
"endedAt": {
"type": "string"
},
"summary": {
"type": "string"
},
"industry": {
"type": "string"
},
"verified": {
"type": "boolean"
},
"createdAt": {
"type": "string"
},
"documents": {
"type": "array",
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string"
},
"title": {
"type": "string"
}
},
"additionalProperties": false
}
},
"startedAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
},
"actionable": {
"type": "boolean"
},
"governance": {
"type": "boolean"
},
"importance": {
"type": "string"
},
"intelCategories": {
"type": "array",
"items": {
"type": "string"
}
},
"intelSubcategories": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"description": "The matching developments"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Read monitored developments",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Read events from Blockworks' monitoring coverage of the crypto industry.
An event is a story over time: a group of related developments from Blockworks' editorial coverage
of the industry, with rollups over its children — importance, category, asset coverage, a start and
end, and how many developments and documents it spans. Like developments, events cover companies,
protocols and assets, not individual people. Read events when you want the arc of something; read
monitoring_developments when you want the individual things that happened.
THREE WAYS TO READ, chosen by what you pass, matching monitoring_developments exactly:
- Nothing extra: the whole corpus, narrowed by the filters you pass.
- monitoringViewId: only what one saved monitoring view matches, narrowed further by your filters.
- monitoringViewId "all": the deduplicated union across every view the caller can see. This route
applies a smaller filter set — minimumImportance, actionable, assetSectors, assetSubsectors,
assetPreTge, assetEcosystemNetworkIds and search — and rejects the rest rather than ignoring them.
- eventId: that one event by UUID or slug, filters ignored.
A list read answers in events, each carrying slim summaries of its developments. An eventId read
answers in event instead, with every development hydrated with its source documents and assets — so
fetch the event by id when you need to cite the reporting behind a story.
Filters combine with AND and behave as they do in monitoring_developments: category slugs come from
monitoring_categories, start and end bound the event's own window, and a filter on a development
property selects events with a matching development.
Returns at most 50 events, 10 by default, plus totalRows and totalPages for the whole filtered set.
ACCESS: this reads Blockworks' monitoring product, which an account is entitled to separately. A
FORBIDDEN result means this session cannot read it — either the account is not entitled, or its
credential type is not accepted — and the error says which. Either way, relay it and stop: do not
retry, and do not try the other monitoring_* tools for the same user, because they go through the
same gateway and will refuse too.
The description explains the capability, when to use it, and what to expect.
Inputs86/100
Explain the meaning of this value, not just its name.
eventId
Read this one event by UUID or slug and return it with its developments fully hydrated. Every filter argument is ignored when it is set.
Clear enough to supply this argument.
monitoringViewId
Scope the read to one saved monitoring view, by UUID or slug-with-id-prefix, as monitoring_views returns it. Pass all for the deduplicated union across every view the caller can see. Omit to read the whole corpus.
Clear enough to supply this argument.
assetIds
Restrict to these assets. Each entry is an asset UUID, slug (bitcoin) or symbol (BTC); a symbol can expand to several assets. A token that matches no asset is dropped, and a filter where none match returns an empty page.
Clear enough to supply this argument.
intelCategories
Restrict to these taxonomy category slugs, exactly as monitoring_categories returns them.
Clear enough to supply this argument.
intelSubcategories
Restrict to these taxonomy subcategory slugs, exactly as monitoring_categories returns them.
Clear enough to supply this argument.
minimumImportance
Lowest editorial importance rating to include: not-important, low, medium or high. Importance is assigned by Blockworks' editors.
Clear enough to supply this argument.
verified
true restricts to analyst-approved records. Omit to include both.
Clear enough to supply this argument.
actionable
true restricts to records Blockworks' editors tagged actionable. Omit to include both.
Clear enough to supply this argument.
governance
true restricts to governance records. Omit to include both.
Clear enough to supply this argument.
assetSectors
Restrict to assets in these sectors.
Clear enough to supply this argument.
assetSubsectors
Restrict to assets in these subsectors.
Explain the meaning of this value, not just its name.
assetPreTge
true restricts to pre-TGE assets. Omit to include both.
Clear enough to supply this argument.
assetEcosystemNetworkIds
Restrict to assets in these ecosystem networks, by network id.
Explain the meaning of this value, not just its name.
includeSecondaryAssets
true also matches assets merely mentioned rather than central to the record. Defaults to false, matching only the record's primary assets. Not available on a view-scoped read.
Explain the meaning of this value, not just its name.
eventIds
Restrict to records belonging to these events. Each entry is an event UUID or a slug-with-id-prefix such as aave-v4-launch-a1b2c3d4. A token that resolves to no event fails the call.
Explain the meaning of this value, not just its name.
start
Lower bound on the record's own time window, as YYYY-MM-DD, RFC3339 or unix seconds.
Clear enough to supply this argument.
end
Upper bound on the record's own time window, same formats as start.
Clear enough to supply this argument.
search
Free-text search over titles and summaries, at most 200 characters.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
List the saved monitoring views this user can see, or describe one in full.
A monitoring view is a saved predicate set — assets, categories, minimum importance, editorial
flags — that developments and events are continuously matched against. It is what a user has told
Blockworks to watch. Views are personal or shared with the user's team; this tool shows both, and
shows only this user's, never anyone else's.
Call it to answer "what am I watching", to report what a view has matched recently, or to get the
id that scopes a monitoring_developments or monitoring_events read. Those two tools also accept
monitoringViewId "all" to read across every view at once, which needs no id from here.
Each view returns its predicates, matchStats (total and 24-hour match counts at both development and
event level, and the last time it matched), and whether the user owns it or it is team-shared. A
predicate that reads null is one the view does not constrain, which is not the same as constraining
it to false. A view with a prompt is an agentic view, matched by that prompt rather than by
predicates alone, and evaluationProgress reports how far its evaluation has got.
This tool is read-only: it cannot create, edit or delete a view.
ACCESS: this reads Blockworks' monitoring product, which an account is entitled to separately. A
FORBIDDEN result means this session cannot read it — either the account is not entitled, or its
credential type is not accepted — and the error says which. Either way, relay it and stop: do not
retry, and do not try the other monitoring_* tools for the same user, because they go through the
same gateway and will refuse too.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
monitoringViewId
Describe this one view by UUID or slug-with-id-prefix. Omit to list every view the caller can see.
Clear enough to supply this argument.
page
1-based page number. Defaults to 1. Ignored when monitoringViewId is set.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Views per page. Defaults to 10, maximum 50. Ignored when monitoringViewId is set.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "monitoring_views",
"title": "Browse monitoring views",
"description": "List the saved monitoring views this user can see, or describe one in full.\n\nA monitoring view is a saved predicate set — assets, categories, minimum importance, editorial\nflags — that developments and events are continuously matched against. It is what a user has told\nBlockworks to watch. Views are personal or shared with the user's team; this tool shows both, and\nshows only this user's, never anyone else's.\n\nCall it to answer \"what am I watching\", to report what a view has matched recently, or to get the\nid that scopes a monitoring_developments or monitoring_events read. Those two tools also accept\nmonitoringViewId \"all\" to read across every view at once, which needs no id from here.\n\nEach view returns its predicates, matchStats (total and 24-hour match counts at both development and\nevent level, and the last time it matched), and whether the user owns it or it is team-shared. A\npredicate that reads null is one the view does not constrain, which is not the same as constraining\nit to false. A view with a prompt is an agentic view, matched by that prompt rather than by\npredicates alone, and evaluationProgress reports how far its evaluation has got.\n\nThis tool is read-only: it cannot create, edit or delete a view.\n\nACCESS: this reads Blockworks' monitoring product, which an account is entitled to separately. A\nFORBIDDEN result means this session cannot read it — either the account is not entitled, or its\ncredential type is not accepted — and the error says which. Either way, relay it and stop: do not\nretry, and do not try the other monitoring_* tools for the same user, because they go through the\nsame gateway and will refuse too.",
"inputSchema": {
"type": "object",
"properties": {
"page": {
"type": [
"null",
"integer"
],
"description": "1-based page number. Defaults to 1. Ignored when monitoringViewId is set."
},
"limit": {
"type": [
"null",
"integer"
],
"description": "Views per page. Defaults to 10, maximum 50. Ignored when monitoringViewId is set."
},
"monitoringViewId": {
"type": "string",
"description": "Describe this one view by UUID or slug-with-id-prefix. Omit to list every view the caller can see."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"views"
],
"properties": {
"views": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"teamShared",
"isOwner",
"matchStats",
"assetIds",
"assetSectors",
"assetSubsectors",
"assetPreTge",
"verified",
"actionable",
"governance",
"assetEcosystemNetworkIds",
"includeSecondaryAssets",
"intelCategories",
"intelSubcategories",
"evaluationProgress"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"prompt": {
"type": "string"
},
"isOwner": {
"type": "boolean"
},
"assetIds": {
"type": "array",
"items": {
"type": "string"
}
},
"verified": {
"type": [
"null",
"boolean"
]
},
"actionable": {
"type": [
"null",
"boolean"
]
},
"governance": {
"type": [
"null",
"boolean"
]
},
"matchStats": {
"type": "object",
"required": [
"developmentMatchCountTotal",
"developmentMatchCount24h",
"eventMatchCountTotal",
"eventMatchCount24h"
],
"properties": {
"lastMatchAt": {
"type": "string"
},
"eventMatchCount24h": {
"type": "integer",
"maximum": 2147483647,
"minimum": -2147483648
},
"eventMatchCountTotal": {
"type": "integer",
"maximum": 2147483647,
"minimum": -2147483648
},
"developmentMatchCount24h": {
"type": "integer",
"maximum": 2147483647,
"minimum": -2147483648
},
"developmentMatchCountTotal": {
"type": "integer",
"maximum": 2147483647,
"minimum": -2147483648
}
},
"additionalProperties": false
},
"teamShared": {
"type": "boolean"
},
"assetPreTge": {
"type": [
"null",
"boolean"
]
},
"assetSectors": {
"type": "array",
"items": {
"type": "string"
}
},
"assetSubsectors": {
"type": "array",
"items": {
"type": "string"
}
},
"evaluationEndAt": {
"type": "string"
},
"intelCategories": {
"type": "array",
"items": {
"type": "string"
}
},
"configurationType": {
"type": "string"
},
"evaluationStartAt": {
"type": "string"
},
"minimumImportance": {
"type": "string"
},
"evaluationProgress": {
"type": "object",
"required": [
"total",
"completed"
],
"properties": {
"total": {
"type": "integer",
"maximum": 2147483647,
"minimum": -2147483648
},
"completed": {
"type": "integer",
"maximum": 2147483647,
"minimum": -2147483648
}
},
"additionalProperties": false
},
"intelSubcategories": {
"type": "array",
"items": {
"type": "string"
}
},
"includeSecondaryAssets": {
"type": "boolean"
},
"assetEcosystemNetworkIds": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"description": "The monitoring views, each with its saved predicates and match statistics"
},
"pagination": {
"type": [
"null",
"object"
],
"required": [
"limit",
"page",
"totalRows",
"totalPages"
],
"properties": {
"page": {
"type": "integer"
},
"limit": {
"type": "integer"
},
"totalRows": {
"type": "integer"
},
"totalPages": {
"type": "integer"
}
},
"description": "Totals for the whole set. Absent on a single-view read.",
"additionalProperties": false
},
"request_id": {
"type": "string",
"description": "The ID of the request behind this result. Quote it if you report the result with submit_feedback."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Browse monitoring views",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Search Blockworks' indexed corpus of crypto research and news and return the matching source documents, each with its title, URL, publication date and text. It returns documents only; it does not write an answer.
The corpus holds Blockworks research, news, governance records, diligence reports and conference transcripts, plus curated third-party news and social media posts that Blockworks ingests in advance. A call does not query news sites or social networks. When the question names a specific project, the search may additionally fetch pages from that project's own website; those results carry the domain "web".
Use this tool for explanations and background, news and events, governance proposals, diligence findings and transcripts: any question that needs text evidence to cite. Use tabular_data or timeseries_data instead for numbers, rankings, aggregates and time series such as price, volume, TVL, fees, revenue, supply, funding amounts and unlock schedules.
Input: query, one natural language question. Ask one thing per call; several focused calls work better than one broad one. The corpus spans years and the time window is read from the wording, so name concrete dates when the question is time-sensitive ("in August 2026", "since 2026-08-01") rather than "latest" or "recently". A query with no date returns the best matches from the whole corpus, most of which will be old.
Output: sources, the retrieved documents, each with domain (the indexed collection it came from, or web for a live page), title, url, published_at (absent when the corpus carries no date) and content; and error, set only when no usable document was found. Cite documents by their title and url.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
One natural language question. Ask one thing per call.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"required": [
"sources"
],
"properties": {
"error": {
"type": "string",
"description": "Set only when the run finds no usable document"
},
"sources": {
"type": "array",
"items": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Canonical URL. Cite this."
},
"title": {
"type": "string",
"description": "Document title"
},
"domain": {
"type": "string",
"description": "Indexed collection the document came from: research, news, external_news, diligence, governance, twitter, video_transcript, and others. web marks a live web search result."
},
"content": {
"type": "string",
"description": "Document text"
},
"published_at": {
"type": "string",
"description": "Publication time. Absent when the corpus carries no date."
}
},
"additionalProperties": false
},
"description": "The retrieved documents"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "search_documents",
"title": "Search Blockworks documents",
"description": "Search Blockworks' indexed corpus of crypto research and news and return the matching source documents, each with its title, URL, publication date and text. It returns documents only; it does not write an answer.\n\nThe corpus holds Blockworks research, news, governance records, diligence reports and conference transcripts, plus curated third-party news and social media posts that Blockworks ingests in advance. A call does not query news sites or social networks. When the question names a specific project, the search may additionally fetch pages from that project's own website; those results carry the domain \"web\".\n\nUse this tool for explanations and background, news and events, governance proposals, diligence findings and transcripts: any question that needs text evidence to cite. Use tabular_data or timeseries_data instead for numbers, rankings, aggregates and time series such as price, volume, TVL, fees, revenue, supply, funding amounts and unlock schedules.\n\nInput: query, one natural language question. Ask one thing per call; several focused calls work better than one broad one. The corpus spans years and the time window is read from the wording, so name concrete dates when the question is time-sensitive (\"in August 2026\", \"since 2026-08-01\") rather than \"latest\" or \"recently\". A query with no date returns the best matches from the whole corpus, most of which will be old.\n\nOutput: sources, the retrieved documents, each with domain (the indexed collection it came from, or web for a live page), title, url, published_at (absent when the corpus carries no date) and content; and error, set only when no usable document was found. Cite documents by their title and url.",
"inputSchema": {
"type": "object",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"description": "One natural language question. Ask one thing per call."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"sources"
],
"properties": {
"error": {
"type": "string",
"description": "Set only when the run finds no usable document"
},
"sources": {
"type": "array",
"items": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Canonical URL. Cite this."
},
"title": {
"type": "string",
"description": "Document title"
},
"domain": {
"type": "string",
"description": "Indexed collection the document came from: research, news, external_news, diligence, governance, twitter, video_transcript, and others. web marks a live web search result."
},
"content": {
"type": "string",
"description": "Document text"
},
"published_at": {
"type": "string",
"description": "Publication time. Absent when the corpus carries no date."
}
},
"additionalProperties": false
},
"description": "The retrieved documents"
}
},
"additionalProperties": false
},
"annotations": {
"title": "Search Blockworks documents",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Report a problem you hit while using Blockworks data, so Blockworks can fix it. Report it when:
- a call returned an error, an empty result, or values that look wrong;
- you guessed an identifier, slug or series key, or needed a lookup table to turn a name into one;
- two models or metrics looked equivalent and you could not tell which to use;
- data or a capability you needed was missing, or the docs did not answer your question.
Call it as soon as you have a workaround or have given up, before you reply to your user: once you start the reply, the report gets dropped. Send one call per distinct issue. Include the exact request you made, what you expected, what you tried, any workaround that worked, and the request_id of each result involved (an error shows it as "request ID").
You do not need to ask your user before calling it. Submissions are stored by Blockworks and attributed to your account, so leave out personal or sensitive data from your user's conversation. Submissions are free and do not count against usage.
Returns feedback_id, and truncated when any field was cut to its limit.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
category
One of bug (something failed or returned wrong results), data_quality (data that is missing, stale or wrong) or feature_request (data or a capability you needed and could not find).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
message
What happened, what you expected, what you tried and any workaround that worked. Include request IDs from the responses involved. Up to 4,000 characters; longer text is cut.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tool
The MCP tool the report is about, e.g. tabular_data.
Clear enough to supply this argument.
endpoint
The REST endpoint the report is about, if any.
Clear enough to supply this argument.
request
The exact request you made: tool arguments as JSON, or the URL. Up to 2 KB; longer text is cut.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agent
The agent or client you are, e.g. Claude Code.
Explain what happens when this optional value is omitted.
{
"type": "object",
"required": [
"feedback_id",
"truncated"
],
"properties": {
"truncated": {
"type": "boolean",
"description": "True when any field was longer than its limit and was cut."
},
"feedback_id": {
"type": "string",
"description": "The submission's ID. Quote it if you follow up."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "submit_feedback",
"title": "Submit feedback",
"description": "Report a problem you hit while using Blockworks data, so Blockworks can fix it. Report it when:\n- a call returned an error, an empty result, or values that look wrong;\n- you guessed an identifier, slug or series key, or needed a lookup table to turn a name into one;\n- two models or metrics looked equivalent and you could not tell which to use;\n- data or a capability you needed was missing, or the docs did not answer your question.\n\nCall it as soon as you have a workaround or have given up, before you reply to your user: once you start the reply, the report gets dropped. Send one call per distinct issue. Include the exact request you made, what you expected, what you tried, any workaround that worked, and the request_id of each result involved (an error shows it as \"request ID\").\n\nYou do not need to ask your user before calling it. Submissions are stored by Blockworks and attributed to your account, so leave out personal or sensitive data from your user's conversation. Submissions are free and do not count against usage.\n\nReturns feedback_id, and truncated when any field was cut to its limit.",
"inputSchema": {
"type": "object",
"required": [
"category",
"message"
],
"properties": {
"tool": {
"type": "string",
"description": "The MCP tool the report is about, e.g. tabular_data."
},
"agent": {
"type": "string",
"description": "The agent or client you are, e.g. Claude Code."
},
"message": {
"type": "string",
"description": "What happened, what you expected, what you tried and any workaround that worked. Include request IDs from the responses involved. Up to 4,000 characters; longer text is cut."
},
"request": {
"type": "string",
"description": "The exact request you made: tool arguments as JSON, or the URL. Up to 2 KB; longer text is cut."
},
"category": {
"type": "string",
"description": "One of bug (something failed or returned wrong results), data_quality (data that is missing, stale or wrong) or feature_request (data or a capability you needed and could not find)."
},
"endpoint": {
"type": "string",
"description": "The REST endpoint the report is about, if any."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"feedback_id",
"truncated"
],
"properties": {
"truncated": {
"type": "boolean",
"description": "True when any field was longer than its limit and was cut."
},
"feedback_id": {
"type": "string",
"description": "The submission's ID. Quote it if you follow up."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Submit feedback",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
List the tabular datasets this server serves, or describe one in full.
Tabular models are row-and-column datasets — assets, exchanges, funding rounds, funds, ETF holdings
— as opposed to metrics over time, which timeseries_catalog covers.
Call this before tabular_data. It returns the exact model slug, the exact column field names, which
columns are sortable, and which filter operators each column accepts. tabular_data rejects any field
or operator that does not match the catalog exactly.
With no arguments it returns one compact entry per model. Pass a model slug for that model's full
column list, or search to narrow the list.
This catalog lists only the models Blockworks publishes to the public API; any model it does not
publish is omitted here and cannot be discovered through this tool. Publishing is separate from data
access: a listed model still carries an access tier, so reading a paid, unpaid or permissive model
needs an API key with the matching entitlement, while a public model needs none.
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Input documentation gives an agent enough context to populate the arguments.
model
Slug of one model to describe in full, including every column. Omit to list all models compactly.
Clear enough to supply this argument.
search
Case-insensitive substring matched against model name, slug and description. Ignored when model is set.
{
"name": "tabular_catalog",
"title": "Browse tabular datasets",
"description": "List the tabular datasets this server serves, or describe one in full.\n\nTabular models are row-and-column datasets — assets, exchanges, funding rounds, funds, ETF holdings\n— as opposed to metrics over time, which timeseries_catalog covers.\n\nCall this before tabular_data. It returns the exact model slug, the exact column field names, which\ncolumns are sortable, and which filter operators each column accepts. tabular_data rejects any field\nor operator that does not match the catalog exactly.\n\nWith no arguments it returns one compact entry per model. Pass a model slug for that model's full\ncolumn list, or search to narrow the list.\n\nThis catalog lists only the models Blockworks publishes to the public API; any model it does not\npublish is omitted here and cannot be discovered through this tool. Publishing is separate from data\naccess: a listed model still carries an access tier, so reading a paid, unpaid or permissive model\nneeds an API key with the matching entitlement, while a public model needs none.",
"inputSchema": {
"type": "object",
"properties": {
"model": {
"type": "string",
"description": "Slug of one model to describe in full, including every column. Omit to list all models compactly."
},
"search": {
"type": "string",
"description": "Case-insensitive substring matched against model name, slug and description. Ignored when model is set."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"properties": {
"model": {
"type": [
"null",
"object"
],
"required": [
"name",
"slug",
"access",
"columns"
],
"properties": {
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"access": {
"type": "object",
"required": [
"tier"
],
"properties": {
"tier": {
"type": "string"
},
"permissionSlug": {
"type": "string"
}
},
"additionalProperties": false
},
"columns": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"field",
"type",
"primaryKey",
"sortable",
"defaultSort",
"filters"
],
"properties": {
"name": {
"type": "string"
},
"type": {
"type": "string"
},
"unit": {
"type": "string"
},
"field": {
"type": "string"
},
"filters": {
"type": "array",
"items": {
"type": "string"
}
},
"sortable": {
"type": "boolean"
},
"primaryKey": {
"type": "boolean"
},
"defaultSort": {
"type": "boolean"
},
"description": {
"type": "string"
}
},
"additionalProperties": false
}
},
"description": {
"type": "string"
}
},
"additionalProperties": false
},
"models": {
"type": [
"null",
"array"
],
"items": {
"type": "object",
"required": [
"slug",
"name",
"access",
"columnCount"
],
"properties": {
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"access": {
"type": "object",
"required": [
"tier"
],
"properties": {
"tier": {
"type": "string"
},
"permissionSlug": {
"type": "string"
}
},
"additionalProperties": false
},
"columnCount": {
"type": "integer"
},
"description": {
"type": "string"
}
},
"additionalProperties": false
}
},
"request_id": {
"type": "string",
"description": "The ID of the request behind this result. Quote it if you report the result with submit_feedback."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Browse tabular datasets",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Read rows from one tabular dataset, filtered, sorted and paginated.
Use this for row-oriented records: entity lists, rankings, attributes, comparisons and point-in-time
snapshots. Do NOT use it for values over time such as price, TVL, fees, volume or supply history —
use timeseries_data — or for written or qualitative questions — use search_documents.
Call tabular_catalog with this model's slug first. Every string passed in model, selections, filters
and sortBy must match the catalog exactly.
Filters are objects of the form {field, operator, values}, combined with AND. A column only accepts
the operators listed in its catalog entry. Values are written as strings and coerced to the column's
type; dates accept YYYY-MM-DD, RFC3339 or unix seconds. Includes and IncludesAnyOf apply to columns
holding arrays.
Returns at most 200 rows, 25 by default, plus totalRows and totalPages for the whole filtered set —
check totalRows before concluding you have seen everything. To answer a question about a large
model, filter and sort on the server rather than paging through it.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
model
required,Slug of the tabular model to read, exactly as tabular_catalog returns it.
Clear enough to supply this argument.
selections
Column fields to return. Omit for every column; naming only the fields you need keeps the response small.
Clear enough to supply this argument.
filters › items › field
Column field name, exactly as tabular_catalog returns it.
Clear enough to supply this argument.
filters › items › operator
Comparison to apply. Must be one of the operators the column lists in its filters: Eq, NotEq, Gt, Gte, Lt, Lte, IsOneOf, IsNotOneOf, Contains, Includes, NotIncludes, IncludesAnyOf, NotIncludesAnyOf.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
filters › items › values
Values to compare against, written as strings and coerced to the column's type. Dates accept YYYY-MM-DD, RFC3339 or unix seconds. Single-value operators take exactly one value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sortBy
Column field to sort by. Must be a column the catalog marks sortable. Defaults to the model's default sort column.
Clear enough to supply this argument.
sortDirection
Sort order, asc or desc. Defaults to asc.
Clear enough to supply this argument.
page
1-based page number. Defaults to 1.
Clear enough to supply this argument.
pageSize
Rows per page. Defaults to 25, maximum 200.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations100/100
All four behavior hints are declared.
{
"title": "Read rows from a tabular dataset",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
Output schema79/100
The output schema explains the structured result.
View output schema
{
"type": "object",
"required": [
"model",
"rows",
"totalRows",
"totalPages",
"page",
"pageSize"
],
"properties": {
"page": {
"type": "integer"
},
"rows": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
"model": {
"type": "string"
},
"warning": {
"type": "string",
"description": "Set when the read matched no rows. Says what to check before concluding the data is missing."
},
"pageSize": {
"type": "integer"
},
"totalRows": {
"type": "integer",
"minimum": 0
},
"request_id": {
"type": "string",
"description": "The ID of the request behind this result. Quote it if you report the result with submit_feedback."
},
"totalPages": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "tabular_data",
"title": "Read rows from a tabular dataset",
"description": "Read rows from one tabular dataset, filtered, sorted and paginated.\n\nUse this for row-oriented records: entity lists, rankings, attributes, comparisons and point-in-time\nsnapshots. Do NOT use it for values over time such as price, TVL, fees, volume or supply history —\nuse timeseries_data — or for written or qualitative questions — use search_documents.\n\nCall tabular_catalog with this model's slug first. Every string passed in model, selections, filters\nand sortBy must match the catalog exactly.\n\nFilters are objects of the form {field, operator, values}, combined with AND. A column only accepts\nthe operators listed in its catalog entry. Values are written as strings and coerced to the column's\ntype; dates accept YYYY-MM-DD, RFC3339 or unix seconds. Includes and IncludesAnyOf apply to columns\nholding arrays.\n\nReturns at most 200 rows, 25 by default, plus totalRows and totalPages for the whole filtered set —\ncheck totalRows before concluding you have seen everything. To answer a question about a large\nmodel, filter and sort on the server rather than paging through it.",
"inputSchema": {
"type": "object",
"required": [
"model"
],
"properties": {
"page": {
"type": [
"null",
"integer"
],
"description": "1-based page number. Defaults to 1."
},
"model": {
"type": "string",
"description": "required,Slug of the tabular model to read, exactly as tabular_catalog returns it."
},
"sortBy": {
"type": "string",
"description": "Column field to sort by. Must be a column the catalog marks sortable. Defaults to the model's default sort column."
},
"filters": {
"type": "array",
"items": {
"type": "object",
"required": [
"field",
"operator",
"values"
],
"properties": {
"field": {
"type": "string",
"description": "Column field name, exactly as tabular_catalog returns it."
},
"values": {
"type": "array",
"items": {
"type": "string"
},
"description": "Values to compare against, written as strings and coerced to the column's type. Dates accept YYYY-MM-DD, RFC3339 or unix seconds. Single-value operators take exactly one value."
},
"operator": {
"type": "string",
"description": "Comparison to apply. Must be one of the operators the column lists in its filters: Eq, NotEq, Gt, Gte, Lt, Lte, IsOneOf, IsNotOneOf, Contains, Includes, NotIncludes, IncludesAnyOf, NotIncludesAnyOf."
}
},
"additionalProperties": false
},
"description": "Conditions rows must satisfy, combined with AND."
},
"pageSize": {
"type": [
"null",
"integer"
],
"description": "Rows per page. Defaults to 25, maximum 200."
},
"selections": {
"type": "array",
"items": {
"type": "string"
},
"description": "Column fields to return. Omit for every column; naming only the fields you need keeps the response small."
},
"sortDirection": {
"type": "string",
"description": "Sort order, asc or desc. Defaults to asc."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"model",
"rows",
"totalRows",
"totalPages",
"page",
"pageSize"
],
"properties": {
"page": {
"type": "integer"
},
"rows": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
"model": {
"type": "string"
},
"warning": {
"type": "string",
"description": "Set when the read matched no rows. Says what to check before concluding the data is missing."
},
"pageSize": {
"type": "integer"
},
"totalRows": {
"type": "integer",
"minimum": 0
},
"request_id": {
"type": "string",
"description": "The ID of the request behind this result. Quote it if you report the result with submit_feedback."
},
"totalPages": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false
},
"annotations": {
"title": "Read rows from a tabular dataset",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
List the time-series datasets this server serves, or describe one in full.
Timeseries models are metrics observed over time — prices, supply, revenue, volumes, mindshare —
split into named series, usually one per asset, protocol, exchange or sector, and available at fixed
granularities.
Call this before timeseries_data. It returns the exact model slug, the granularities the model
supports, the exact metric field names, and whether the model can return every series at once
(allowAllSeries true) or requires you to name the series keys.
With no arguments it returns one compact entry per model. Pass a model slug for that model's full
metric list, or search to narrow the list.
Series keys are the model's own identifiers, usually opaque ids rather than tickers or names. To turn
a name or symbol into a series key, read the matching tabular model with tabular_data and take the
key from the matching row.
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Input documentation gives an agent enough context to populate the arguments.
model
Slug of one model to describe in full, including every metric. Omit to list all models compactly.
Clear enough to supply this argument.
search
Case-insensitive substring matched against model name, slug and description. Ignored when model is set.
{
"name": "timeseries_catalog",
"title": "Browse time-series datasets",
"description": "List the time-series datasets this server serves, or describe one in full.\n\nTimeseries models are metrics observed over time — prices, supply, revenue, volumes, mindshare —\nsplit into named series, usually one per asset, protocol, exchange or sector, and available at fixed\ngranularities.\n\nCall this before timeseries_data. It returns the exact model slug, the granularities the model\nsupports, the exact metric field names, and whether the model can return every series at once\n(allowAllSeries true) or requires you to name the series keys.\n\nWith no arguments it returns one compact entry per model. Pass a model slug for that model's full\nmetric list, or search to narrow the list.\n\nSeries keys are the model's own identifiers, usually opaque ids rather than tickers or names. To turn\na name or symbol into a series key, read the matching tabular model with tabular_data and take the\nkey from the matching row.",
"inputSchema": {
"type": "object",
"properties": {
"model": {
"type": "string",
"description": "Slug of one model to describe in full, including every metric. Omit to list all models compactly."
},
"search": {
"type": "string",
"description": "Case-insensitive substring matched against model name, slug and description. Ignored when model is set."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"properties": {
"model": {
"type": [
"null",
"object"
],
"required": [
"name",
"slug",
"access",
"intervals",
"allowAllSeries",
"columns"
],
"properties": {
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"access": {
"type": "object",
"required": [
"tier"
],
"properties": {
"tier": {
"type": "string"
},
"permissionSlug": {
"type": "string"
}
},
"additionalProperties": false
},
"columns": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"field",
"type",
"time",
"seriesKey"
],
"properties": {
"name": {
"type": "string"
},
"time": {
"type": "boolean"
},
"type": {
"type": "string"
},
"unit": {
"type": "string"
},
"field": {
"type": "string"
},
"seriesKey": {
"type": "boolean"
},
"description": {
"type": "string"
}
},
"additionalProperties": false
}
},
"intervals": {
"type": "array",
"items": {
"type": "string"
}
},
"description": {
"type": "string"
},
"allowAllSeries": {
"type": "boolean"
}
},
"additionalProperties": false
},
"models": {
"type": [
"null",
"array"
],
"items": {
"type": "object",
"required": [
"slug",
"name",
"access",
"metricCount",
"intervals",
"allowAllSeries"
],
"properties": {
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"access": {
"type": "object",
"required": [
"tier"
],
"properties": {
"tier": {
"type": "string"
},
"permissionSlug": {
"type": "string"
}
},
"additionalProperties": false
},
"intervals": {
"type": "array",
"items": {
"type": "string"
}
},
"description": {
"type": "string"
},
"metricCount": {
"type": "integer"
},
"allowAllSeries": {
"type": "boolean"
}
},
"additionalProperties": false
}
},
"request_id": {
"type": "string",
"description": "The ID of the request behind this result. Quote it if you report the result with submit_feedback."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Browse time-series datasets",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Read points from one time-series dataset over a time window.
Use this for numeric values that change over time: price, volume, TVL, fees, supply and similar
metrics. Do NOT use it for written or qualitative questions such as news, research, governance or
explanations — use search_documents — or for entity lists, rankings or snapshots — use tabular_data.
Call timeseries_catalog with this model's slug first: the slug, the valid granularities, the metric
field names, and whether every series can be read at once all come from there. Series keys are the
model's own identifiers — if you have only a name or a ticker, resolve it through the matching
tabular model with tabular_data.
Points are positional arrays, not objects: position 0 is a unix timestamp in seconds and the
remaining positions follow point_schema in order. Read point_schema before interpreting any point.
Choose a window with either timeframe (relative: 30d, 12h, 4w, or ytd, qtd, mtd, dtd; or calendar:
2024, 2024-06, 2024-06-01) or start and end — never both. With none of them the window defaults to
the last 90 days. Set bounds true to get only the first and last point of the window for each
series, which is the cheap way to compute a change over a period.
One call returns at most 5000 points across all series. If a call is rejected for exceeding that,
shorten the timeframe, use a coarser granularity, name fewer series, select fewer metrics, or set
bounds true.
The description explains the capability, when to use it, and what to expect.
Inputs89/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
model
required,Slug of the timeseries model to read, exactly as timeseries_catalog returns it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
granularity
Point spacing, one of the intervals the catalog lists for this model (for example 1h, 1d, 1w). Defaults to 1d.
Clear enough to supply this argument.
series
Series keys to read, at most 10. Omit for every series, which only models with allowAllSeries true support.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
selections
Metric fields each point should carry after the leading timestamp. Omit for every metric.
Clear enough to supply this argument.
timeframe
Relative window ending now: 30d, 12h, 4w, or ytd, qtd, mtd, dtd. A bare year, YYYY-MM or YYYY-MM-DD selects that whole calendar period. Do not combine with start or end. Defaults to 90d.
Clear enough to supply this argument.
start
Inclusive window start as YYYY-MM-DD, RFC3339 or unix seconds. Do not combine with timeframe.
Clear enough to supply this argument.
end
Exclusive window end, same formats as start. Defaults to now.
Clear enough to supply this argument.
bounds
Return only the first and last point of the window for each series, the cheap way to compute a change over a period.
Clear enough to supply this argument.
Annotations100/100
All four behavior hints are declared.
{
"title": "Read points from a time-series dataset",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
Output schema60/100
Describe the returned fields so an agent can interpret the result.
View output schema
{
"type": "object",
"required": [
"model",
"granularity",
"point_schema",
"series",
"totalPoints"
],
"properties": {
"model": {
"type": "string"
},
"series": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"points"
],
"properties": {
"key": {
"type": "string"
},
"entity": {
"type": "object",
"additionalProperties": true
},
"points": {
"type": "array",
"items": {
"type": "array",
"items": true
}
}
},
"additionalProperties": false
}
},
"warning": {
"type": "string",
"description": "Set when a series you named, or the whole read, returned no points. Says what to check before concluding the data is missing."
},
"request_id": {
"type": "string",
"description": "The ID of the request behind this result. Quote it if you report the result with submit_feedback."
},
"granularity": {
"type": "string"
},
"totalPoints": {
"type": "integer"
},
"point_schema": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"field",
"type",
"time"
],
"properties": {
"name": {
"type": "string"
},
"time": {
"type": "boolean"
},
"type": {
"type": "string"
},
"unit": {
"type": "string"
},
"field": {
"type": "string"
},
"description": {
"type": "string"
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "timeseries_data",
"title": "Read points from a time-series dataset",
"description": "Read points from one time-series dataset over a time window.\n\nUse this for numeric values that change over time: price, volume, TVL, fees, supply and similar\nmetrics. Do NOT use it for written or qualitative questions such as news, research, governance or\nexplanations — use search_documents — or for entity lists, rankings or snapshots — use tabular_data.\n\nCall timeseries_catalog with this model's slug first: the slug, the valid granularities, the metric\nfield names, and whether every series can be read at once all come from there. Series keys are the\nmodel's own identifiers — if you have only a name or a ticker, resolve it through the matching\ntabular model with tabular_data.\n\nPoints are positional arrays, not objects: position 0 is a unix timestamp in seconds and the\nremaining positions follow point_schema in order. Read point_schema before interpreting any point.\n\nChoose a window with either timeframe (relative: 30d, 12h, 4w, or ytd, qtd, mtd, dtd; or calendar:\n2024, 2024-06, 2024-06-01) or start and end — never both. With none of them the window defaults to\nthe last 90 days. Set bounds true to get only the first and last point of the window for each\nseries, which is the cheap way to compute a change over a period.\n\nOne call returns at most 5000 points across all series. If a call is rejected for exceeding that,\nshorten the timeframe, use a coarser granularity, name fewer series, select fewer metrics, or set\nbounds true.",
"inputSchema": {
"type": "object",
"required": [
"model"
],
"properties": {
"end": {
"type": "string",
"description": "Exclusive window end, same formats as start. Defaults to now."
},
"model": {
"type": "string",
"description": "required,Slug of the timeseries model to read, exactly as timeseries_catalog returns it."
},
"start": {
"type": "string",
"description": "Inclusive window start as YYYY-MM-DD, RFC3339 or unix seconds. Do not combine with timeframe."
},
"bounds": {
"type": "boolean",
"description": "Return only the first and last point of the window for each series, the cheap way to compute a change over a period."
},
"series": {
"type": "array",
"items": {
"type": "string"
},
"description": "Series keys to read, at most 10. Omit for every series, which only models with allowAllSeries true support."
},
"timeframe": {
"type": "string",
"description": "Relative window ending now: 30d, 12h, 4w, or ytd, qtd, mtd, dtd. A bare year, YYYY-MM or YYYY-MM-DD selects that whole calendar period. Do not combine with start or end. Defaults to 90d."
},
"selections": {
"type": "array",
"items": {
"type": "string"
},
"description": "Metric fields each point should carry after the leading timestamp. Omit for every metric."
},
"granularity": {
"type": "string",
"description": "Point spacing, one of the intervals the catalog lists for this model (for example 1h, 1d, 1w). Defaults to 1d."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"model",
"granularity",
"point_schema",
"series",
"totalPoints"
],
"properties": {
"model": {
"type": "string"
},
"series": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"points"
],
"properties": {
"key": {
"type": "string"
},
"entity": {
"type": "object",
"additionalProperties": true
},
"points": {
"type": "array",
"items": {
"type": "array",
"items": true
}
}
},
"additionalProperties": false
}
},
"warning": {
"type": "string",
"description": "Set when a series you named, or the whole read, returned no points. Says what to check before concluding the data is missing."
},
"request_id": {
"type": "string",
"description": "The ID of the request behind this result. Quote it if you report the result with submit_feedback."
},
"granularity": {
"type": "string"
},
"totalPoints": {
"type": "integer"
},
"point_schema": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"field",
"type",
"time"
],
"properties": {
"name": {
"type": "string"
},
"time": {
"type": "boolean"
},
"type": {
"type": "string"
},
"unit": {
"type": "string"
},
"field": {
"type": "string"
},
"description": {
"type": "string"
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
},
"annotations": {
"title": "Read points from a time-series dataset",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Read one watchlist and the assets on it, each resolved to its name, slug and ticker symbol.
Get the watchlistId from the watchlists tool. This is the call that turns "my watchlist" into a
concrete set of assets you can then look up elsewhere: the slug each asset carries is the
identifier the asset and dataset routes take.
Assets come back in the order the watchlist holds them. A watchlist stores only asset ids, so the
names are resolved by a second lookup; any id that lookup does not cover is reported in
unresolvedAssetIds rather than guessed at, and note says so. Treat those ids as genuinely on the
watchlist — only their names are missing.
It reads a watchlist the user owns, one their team shares with them, or a public one whose id they
have. This tool is read-only: it cannot add or remove assets.
The description explains the capability, when to use it, and what to expect.
Inputs87/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
watchlistId
The id of the watchlist to read. Get it from the watchlists tool.
Clear enough to supply this argument.
limit
How many assets to return, 1 to 200. Defaults to all of them.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations100/100
All four behavior hints are declared.
{
"title": "Read the assets on a watchlist",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
Output schema81/100
The output schema explains the structured result.
View output schema
{
"type": "object",
"required": [
"watchlist",
"assets",
"unresolvedAssetIds",
"truncated"
],
"properties": {
"note": {
"type": "string",
"description": "Set when something about this result needs stating, such as asset names being unavailable to this session. Relay it."
},
"assets": {
"type": "array",
"items": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Messari asset id (UUID)"
},
"name": {
"type": "string",
"description": "Asset name, e.g. Bitcoin"
},
"slug": {
"type": "string",
"description": "Asset slug, e.g. bitcoin. This is the identifier the asset routes take."
},
"symbol": {
"type": "string",
"description": "Ticker symbol, e.g. BTC"
}
},
"additionalProperties": false
},
"description": "The assets on it, in the order the watchlist holds them"
},
"requestId": {
"type": "string",
"description": "Gateway request id. Quote it in submit_feedback when reporting a problem with this result."
},
"truncated": {
"type": "boolean",
"description": "True when the watchlist holds more assets than this call returned. Raise limit to see the rest."
},
"watchlist": {
"type": "object",
"required": [
"id",
"title",
"assetCount",
"ownerId",
"isPublic",
"showInResearcherProfile"
],
"properties": {
"id": {
"type": "string",
"description": "The watchlist id. Pass it to watchlist_assets to read the assets on it."
},
"title": {
"type": "string",
"description": "The name the user gave this watchlist"
},
"ownerId": {
"type": "integer",
"minimum": 0,
"description": "Messari user id of the owner. Differs from the caller's own id on a watchlist their team shares with them."
},
"isPublic": {
"type": "boolean",
"description": "Whether anyone with the id can read it"
},
"createdAt": {
"type": "string",
"description": "RFC3339 creation time"
},
"updatedAt": {
"type": "string",
"description": "RFC3339 time the watchlist or its membership last changed"
},
"assetCount": {
"type": "integer",
"description": "How many assets are on it"
},
"teamAccess": {
"type": "string",
"description": "How the owner's team may reach it: none, read, or write. Absent or none means it is not team-shared."
},
"showInResearcherProfile": {
"type": "boolean",
"description": "Whether the owner publishes it on their Messari researcher profile"
}
},
"description": "The watchlist these assets belong to",
"additionalProperties": false
},
"unresolvedAssetIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Asset ids on the watchlist that could not be resolved to a name. They are still genuinely on it; only the lookup failed."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "watchlist_assets",
"title": "Read the assets on a watchlist",
"description": "Read one watchlist and the assets on it, each resolved to its name, slug and ticker symbol.\n\nGet the watchlistId from the watchlists tool. This is the call that turns \"my watchlist\" into a\nconcrete set of assets you can then look up elsewhere: the slug each asset carries is the\nidentifier the asset and dataset routes take.\n\nAssets come back in the order the watchlist holds them. A watchlist stores only asset ids, so the\nnames are resolved by a second lookup; any id that lookup does not cover is reported in\nunresolvedAssetIds rather than guessed at, and note says so. Treat those ids as genuinely on the\nwatchlist — only their names are missing.\n\nIt reads a watchlist the user owns, one their team shares with them, or a public one whose id they\nhave. This tool is read-only: it cannot add or remove assets.",
"inputSchema": {
"type": "object",
"required": [
"watchlistId"
],
"properties": {
"limit": {
"type": [
"null",
"integer"
],
"description": "How many assets to return, 1 to 200. Defaults to all of them."
},
"watchlistId": {
"type": "string",
"description": "The id of the watchlist to read. Get it from the watchlists tool."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"watchlist",
"assets",
"unresolvedAssetIds",
"truncated"
],
"properties": {
"note": {
"type": "string",
"description": "Set when something about this result needs stating, such as asset names being unavailable to this session. Relay it."
},
"assets": {
"type": "array",
"items": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Messari asset id (UUID)"
},
"name": {
"type": "string",
"description": "Asset name, e.g. Bitcoin"
},
"slug": {
"type": "string",
"description": "Asset slug, e.g. bitcoin. This is the identifier the asset routes take."
},
"symbol": {
"type": "string",
"description": "Ticker symbol, e.g. BTC"
}
},
"additionalProperties": false
},
"description": "The assets on it, in the order the watchlist holds them"
},
"requestId": {
"type": "string",
"description": "Gateway request id. Quote it in submit_feedback when reporting a problem with this result."
},
"truncated": {
"type": "boolean",
"description": "True when the watchlist holds more assets than this call returned. Raise limit to see the rest."
},
"watchlist": {
"type": "object",
"required": [
"id",
"title",
"assetCount",
"ownerId",
"isPublic",
"showInResearcherProfile"
],
"properties": {
"id": {
"type": "string",
"description": "The watchlist id. Pass it to watchlist_assets to read the assets on it."
},
"title": {
"type": "string",
"description": "The name the user gave this watchlist"
},
"ownerId": {
"type": "integer",
"minimum": 0,
"description": "Messari user id of the owner. Differs from the caller's own id on a watchlist their team shares with them."
},
"isPublic": {
"type": "boolean",
"description": "Whether anyone with the id can read it"
},
"createdAt": {
"type": "string",
"description": "RFC3339 creation time"
},
"updatedAt": {
"type": "string",
"description": "RFC3339 time the watchlist or its membership last changed"
},
"assetCount": {
"type": "integer",
"description": "How many assets are on it"
},
"teamAccess": {
"type": "string",
"description": "How the owner's team may reach it: none, read, or write. Absent or none means it is not team-shared."
},
"showInResearcherProfile": {
"type": "boolean",
"description": "Whether the owner publishes it on their Messari researcher profile"
}
},
"description": "The watchlist these assets belong to",
"additionalProperties": false
},
"unresolvedAssetIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Asset ids on the watchlist that could not be resolved to a name. They are still genuinely on it; only the lookup failed."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Read the assets on a watchlist",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
List this user's watchlists: the named sets of assets they keep on Messari.
Call it to answer "what am I watching", to pick up the assets a question is implicitly about ("how
did my watchlist do this week"), or to get the id that watchlist_assets needs. It returns the
watchlists the user owns plus any shared with them by their team.
Each entry gives the title, how many assets are on it, who owns it, and how it is shared. It does
not give the assets themselves — pass the id to watchlist_assets for those.
Takes no arguments: whose watchlists these are is settled by the session, not by a parameter.
This tool is read-only: it cannot create, rename or delete a watchlist, or change what is on one.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
{
"type": "object",
"required": [
"watchlists"
],
"properties": {
"requestId": {
"type": "string",
"description": "Gateway request id. Quote it in submit_feedback when reporting a problem with this result."
},
"watchlists": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"title",
"assetCount",
"ownerId",
"isPublic",
"showInResearcherProfile"
],
"properties": {
"id": {
"type": "string",
"description": "The watchlist id. Pass it to watchlist_assets to read the assets on it."
},
"title": {
"type": "string",
"description": "The name the user gave this watchlist"
},
"ownerId": {
"type": "integer",
"minimum": 0,
"description": "Messari user id of the owner. Differs from the caller's own id on a watchlist their team shares with them."
},
"isPublic": {
"type": "boolean",
"description": "Whether anyone with the id can read it"
},
"createdAt": {
"type": "string",
"description": "RFC3339 creation time"
},
"updatedAt": {
"type": "string",
"description": "RFC3339 time the watchlist or its membership last changed"
},
"assetCount": {
"type": "integer",
"description": "How many assets are on it"
},
"teamAccess": {
"type": "string",
"description": "How the owner's team may reach it: none, read, or write. Absent or none means it is not team-shared."
},
"showInResearcherProfile": {
"type": "boolean",
"description": "Whether the owner publishes it on their Messari researcher profile"
}
},
"additionalProperties": false
},
"description": "The watchlists, newest activity first as the API orders them"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "watchlists",
"title": "List watchlists",
"description": "List this user's watchlists: the named sets of assets they keep on Messari.\n\nCall it to answer \"what am I watching\", to pick up the assets a question is implicitly about (\"how\ndid my watchlist do this week\"), or to get the id that watchlist_assets needs. It returns the\nwatchlists the user owns plus any shared with them by their team.\n\nEach entry gives the title, how many assets are on it, who owns it, and how it is shared. It does\nnot give the assets themselves — pass the id to watchlist_assets for those.\n\nTakes no arguments: whose watchlists these are is settled by the session, not by a parameter.\n\nThis tool is read-only: it cannot create, rename or delete a watchlist, or change what is on one.",
"inputSchema": {
"type": "object",
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"watchlists"
],
"properties": {
"requestId": {
"type": "string",
"description": "Gateway request id. Quote it in submit_feedback when reporting a problem with this result."
},
"watchlists": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"title",
"assetCount",
"ownerId",
"isPublic",
"showInResearcherProfile"
],
"properties": {
"id": {
"type": "string",
"description": "The watchlist id. Pass it to watchlist_assets to read the assets on it."
},
"title": {
"type": "string",
"description": "The name the user gave this watchlist"
},
"ownerId": {
"type": "integer",
"minimum": 0,
"description": "Messari user id of the owner. Differs from the caller's own id on a watchlist their team shares with them."
},
"isPublic": {
"type": "boolean",
"description": "Whether anyone with the id can read it"
},
"createdAt": {
"type": "string",
"description": "RFC3339 creation time"
},
"updatedAt": {
"type": "string",
"description": "RFC3339 time the watchlist or its membership last changed"
},
"assetCount": {
"type": "integer",
"description": "How many assets are on it"
},
"teamAccess": {
"type": "string",
"description": "How the owner's team may reach it: none, read, or write. Absent or none means it is not team-shared."
},
"showInResearcherProfile": {
"type": "boolean",
"description": "Whether the owner publishes it on their Messari researcher profile"
}
},
"additionalProperties": false
},
"description": "The watchlists, newest activity first as the API orders them"
}
},
"additionalProperties": false
},
"annotations": {
"title": "List watchlists",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
Loading score analytics…
Put your MCP to the test
A few tasks worth trying with this server, chosen from its reviewed tools. These have not been run.
01Search Blockworks documentsSearch Blockworks' indexed corpus of crypto research and news and return the matching source documents, each with its title, URL, publication date and text.
02List watchlistsList this user's watchlists: the named sets of assets they keep on Messari.
03Browse tabular datasetsList the tabular datasets this server serves, or describe one in full.
04Browse time-series datasetsList the time-series datasets this server serves, or describe one in full.
05Browse monitoring viewsList the saved monitoring views this user can see, or describe one in full.
Want to run these tasks against your MCP server with us?
mcp-server setup, tools, quality score, publishing readiness, and alternatives.
How do I add mcp-server to Claude, ChatGPT, or Cursor?
Add mcp-server to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://mcp.blockworks.com/.
Is mcp-server MCP ready for ChatGPT and Claude?
As of November 12, 2026, mcp-server scores 96/100 on Manufact's MCP publishing checklist. The scan meets ChatGPT publishing checks and meets Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is mcp-server's MCP tool documentation?
As of November 12, 2026, mcp-server scores 93/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 12 of 12 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What are the best alternatives to mcp-server?
As of November 13, 2026, alternatives to mcp-server in financial-services on the Manufact MCP leaderboard include SHVL credit control, BankConv, Economico, paidfor: x402 seller reliability, and CoinGecko.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.