Skip to main content
Glama
domechn

Merkl MCP Server

by domechn

Merkl MCP Server

An MCP server exposing Merkl Opportunities endpoints using @modelcontextprotocol/sdk.

Setup

  • Node.js 18+ recommended

  • Install deps

npm install

Optionally set environment variables:

  • MERKL_BASE_URL (default: https://api.merkl.xyz)

  • MERKL_API_KEY (Bearer token if you have one; public endpoints work without it)

Related MCP server: polskidegen-hl-tracker

Run (local)

  • Dev server:

npm run dev
  • Start once:

npm run build
npm start
  • Smoke test (direct HTTP call, not MCP):

npm run smoke

Tools exposed

  • opportunities-search

  • opportunities-get

  • opportunities-campaigns

  • opportunities-count

  • opportunities-bins-apr

  • opportunities-bins-tvl

  • opportunities-aggregate

  • opportunities-aggregate-max

  • opportunities-aggregate-min

Use with an MCP-compatible client

This server uses the stdio transport. Point your MCP client to run the command and read/write on stdio:

  • Command:

npx merkl-mcp
  • Or locally via repo:

npm start

Set env vars as needed (e.g. MERKL_API_KEY). The server will register tools listed above.

Note: Requires Node 18+. Enable debug logs by setting MERKL_DEBUG=1.

One-line npx startup

After publishing as merkl-mcp to npm (or using npm link), you can start the server with:

npx merkl-mcp

If dist/server.js is missing, the CLI will build automatically on first run.

Connect to Claude Desktop (macOS)

Claude Desktop supports MCP over stdio. Add this server to Claude's config and restart the app.

  1. Create or edit config file

  • Path: ~/Library/Application Support/Claude/claude_desktop_config.json

  1. Use the published package (one-line npx)

{
  "mcpServers": {
    "merkl": {
      "command": "npx",
      "args": ["-y", "merkl-mcp"],
      "env": {
        "MERKL_API_KEY": "(Optional) YOUR_API_KEY_OR_REMOVE_IF_UNUSED"
      }
    }
  }
}
  1. Or run from local repo

{
  "mcpServers": {
    "merkl": {
      "command": "node",
      "args": ["dist/src/server.js"],
      "cwd": "./merkl-mcp",
      "env": {
        "MERKL_API_KEY": "(Optional) YOUR_API_KEY_OR_REMOVE_IF_UNUSED"
      }
    }
  }
}
  1. Restart Claude Desktop

  • Start a new chat; the tool named merkl should appear in the Tools list.

Troubleshooting

  • Ensure Node.js 18+ is installed and available to Claude's environment.

  • Remove MERKL_API_KEY if you don't have one; public endpoints work without it.

  • Check Claude logs if tools don't appear; verify the config file path and JSON syntax.

Publish to npm

Set the name in package.json (already set up for you via bin aliases) and publish:

npm login   # if not already
npm publish --access public

Then users can run:

npx merkl-mcp
# or the short alias
npx merkl-mcp

Available Tools

13 tools
campaigns-countCount CampaignsC

GET /v4/campaigns/count

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoFilter by name
tagsNoFilter by tag
testNoInclude test campaigns
typeNoA comma separated list of Campaign type
pointNoInclude point campaigns
actionNoA comma separated list actions. Legal values: POOL,HOLD,DROP,LEND,BORROW,LONG,SHORT,SWAP,INVALID
searchNoSearch amongst multiple values (token, protocols, tags, campaigns)
statusNoA comma separated list of status. Legal values: LIVE,PAST,SOON
tokensNoA comma separated list of token symbol. Use to filter by token
chainIdNoA comma separated list of chain ids. Example: ?chainId=1,42161
chainNameNoA comma separated list of chain names. Example: ?chainName=ethereum,arbitrum
campaignIdNoSearch the campaign by campaignId
identifierNoFilter by identifier (mainParameter)
maximumAprNoMaximum APR threshold
maximumTvlNoMaximum TVL threshold in USD
minimumAprNoMinimum APR threshold
minimumTvlNoMinimum TVL threshold in USD
tokenTypesNoFilter by token type. Use POINT to include point campaigns and PRETGE to include preTGE campaigns.
creatorSlugNo
endTimestampNoFilter campaigns ending before this timestamp
programSlugsNoA comma separated list of program ids or slugs. See GET /v4/programs
opportunityIdNoFilter by opportunity ID
rewardTokenIdNoFilter by reward token ID
computeChainIdNoFilter by compute chain ID
creatorAddressNoFilter by creator address
mainProtocolIdNoA comma separated list of protocol ids. See GET /v4/protocols
startTimestampNoFilter campaigns starting after this timestamp
distributionTypesNoFilter by distribution type. Legal values: FIX_REWARD, MAX_REWARD, DUTCH_AUCTION
rewardTokenSymbolNoFilter by campaign with reward token having this symbol
distributionChainIdNoFilter by distribution chain ID
excludeSubCampaignsNoExclude sub-campaigns from the results

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNumber of campaigns matching the filters

TDQS

C2/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden, and it discloses nothing: no mention of read semantics, return shape, rate limits, or that the many filters behave as AND-combined. A bare URL path provides no behavioral context for a read endpoint with 31 filters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The single line 'GET /v4/campaigns/count' is concise but is not a description — it restates the tool name as a URL path with zero added information. Brevity here reflects under-specification rather than efficient structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 31 optional filters, no annotations, and a sibling set including campaigns-search and campaigns-get, the description is far too thin. Even though an output schema exists, the agent still needs to know when counting is appropriate and how the numerous filters compose, none of which is addressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 97% and every parameter has a description, so the schema does the heavy lifting. The description adds nothing about how filters interact (e.g., comma-separated lists, shared search scope across tokens/protocols/tags/campaigns) and provides no examples, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is only the HTTP endpoint 'GET /v4/campaigns/count'. It implies counting campaigns but does not state what is counted (a scalar count vs. a breakdown), does not differentiate from sibling campaigns-search or campaigns-get, and gives no functional verb phrasing beyond the URL path.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this counting endpoint versus campaigns-search or campaigns-get. There is no mention of pagination-free aggregation or when counting is preferable to listing, leaving the agent to infer intent from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaigns-getGet CampaignD

GET /v4/campaigns/{id}

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe id of the campaign
testNoInclude test campaigns
pointNoInclude point campaigns
tokenTypesNoFilter by token type. Use POINT to include point campaigns and PRETGE to include preTGE campaigns.
excludeSubCampaignsNoExclude sub-campaigns from the results

Output Schema

ParametersJSON Schema
NameRequiredDescription
campaignYesCampaign object or null if not found

TDQS

D1.8/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It provides zero insight into whether the call is read-only (implied by GET), what happens on a missing id, authentication or rate-limit requirements, or how the five optional filtering parameters (test, point, tokenTypes, excludeSubCampaigns) affect the returned campaign. The description is a bare URL pattern.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness1/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The entire description is a single URL template. While extremely short, it is under-specified rather than concise, and it fails to front-load any purpose or usage information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with five parameters, optional filters, and a sibling search tool, the description is completely inadequate. An output schema exists, so return values need not be explained, but the description still omits all selection guidance, behavioral context, and differentiation from siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema fully documents all five parameters including defaults and enum usage. The description does not add any parameter meaning beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is only an HTTP verb and path: 'GET /v4/campaigns/{id}'. It technically identifies the resource (campaigns) and action (get), but it is essentially a restatement of the tool name and adds no distinguishing information from the sibling 'campaigns-search'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus campaigns-search, campaigns-count, or opportunities-campaigns. The agent must infer that a single campaign is fetched by id while search handles query-based retrieval.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-current-timestampGet Current TimestampC

Retrieves the current timestamp.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
timestampYesCurrent timestamp in milliseconds since the Unix epoch

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden, yet it does not state the timezone, precision, or format of the returned timestamp. The operation is inherently a safe, side-effect-free read with zero parameters, so the risk of an uninformed call is low, but a material detail is left undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence, appropriately sized and front-loaded for a trivial tool with no inputs. It is efficient, though it earns its place only barely given that it duplicates the name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the return value need not be explained in the description, and with zero parameters and no annotations there is little else an agent must know. The only omission is any hint about timezone or format expectations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics for the description to explain. Baseline 4 applies per the zero-parameter rule.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description "Retrieves the current timestamp" is a direct restatement of the tool name and title, adding no distinguishing information. It is not misleading and the resource is unambiguous, but it is essentially a tautology rather than a stated purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is offered on when to call this tool or in what situations it is preferred. For a trivial utility the usage is arguably self-evident, but the description supplies none of it explicitly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opportunities-aggregateAggregate FieldD

GET /v4/opportunities/aggregate/{field}

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoFilter by name
tagsNoFilter by tag
testNoInclude opportunities with test campaigns
typeNoA comma separated list of Opportunity type
fieldYesField to aggregate on (e.g. chainId, status, type, action, tokens, tags, programSlugs, mainProtocolId)
pointNoInclude opportunities with point campaigns
actionNoA comma separated list actions. Legal values: POOL,HOLD,DROP,LEND,BORROW,LONG,SHORT,SWAP,INVALID
searchNoSearch amongst multiple values (token, protocols, tags, campaigns)
statusNoA comma separated list of status. Legal values: LIVE,PAST,SOON
tokensNoA comma separated list of token symbol. Use to filter by token
chainIdNoA comma separated list of chain ids. Example: ?chainId=1,42161
campaignsNoInclude campaign data. Will slow down the request
chainNameNoA comma separated list of chain names. Example: ?chainName=ethereum,arbitrum
campaignIdNoSearch the opportunity linked to a given campaignId
identifierNoFilter by identifier (mainParameter)
maximumAprNoMaximum APR threshold
maximumTvlNoMaximum TVL threshold in USD
minimumAprNoMinimum APR threshold
minimumTvlNoMinimum TVL threshold in USD
tokenTypesNoFilter by token type. Use POINT to include point campaigns and PRETGE to include preTGE campaigns.
creatorSlugNo
programSlugsNoA comma separated list of program ids or slugs. See GET /v4/programs
creatorAddressNoFilter by creator address
mainProtocolIdNoA comma separated list of protocol ids. See GET /v4/protocols
distributionTypesNoFilter by distribution type. Legal values: FIX_REWARD, MAX_REWARD, DUTCH_AUCTION
rewardTokenSymbolNoFilter by opportunity with at least 1 campaign where the reward token has this symbol
excludeSubCampaignsNoExclude sub-campaigns from the results

Output Schema

ParametersJSON Schema
NameRequiredDescription
bucketsYesAggregation buckets for the requested field

TDQS

D1.7/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden, yet it discloses nothing about authentication requirements, rate limits, response shape, or what the aggregation returns. A bare URL path conveys zero behavioral context for a 27-parameter endpoint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is short, but that brevity comes from under-specification rather than efficient communication—an endpoint path is not a description. There is no front-loaded statement of purpose or outcome.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 27 parameters, no annotations, and multiple near-identical aggregate siblings, the description is completely inadequate. Even though an output schema exists, the agent has no basis for choosing this tool over aggregate-max or aggregate-min.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 96%, so nearly every parameter is already documented in the schema and the baseline of 3 applies. The description adds nothing beyond echoing the required {field} path parameter, so no extra credit is warranted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is nothing more than a raw endpoint path, 'GET /v4/opportunities/aggregate/{field}', which restates the tool name rather than explaining what aggregation produces. It hints at the resource (opportunities) and an operation (aggregate), but an agent gets no plain-language statement of what the result represents.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus the obvious siblings opportunities-aggregate-max, opportunities-aggregate-min, or opportunities-search. No conditions, prerequisites, or exclusions are stated anywhere.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opportunities-aggregate-maxAggregate MaxD

GET /v4/opportunities/aggregate/max/{field}

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoFilter by name
tagsNoFilter by tag
testNoInclude opportunities with test campaigns
typeNoA comma separated list of Opportunity type
fieldYesNumeric field to compute max on (e.g. apr, tvl, dailyRewards)
pointNoInclude opportunities with point campaigns
actionNoA comma separated list actions. Legal values: POOL,HOLD,DROP,LEND,BORROW,LONG,SHORT,SWAP,INVALID
searchNoSearch amongst multiple values (token, protocols, tags, campaigns)
statusNoA comma separated list of status. Legal values: LIVE,PAST,SOON
tokensNoA comma separated list of token symbol. Use to filter by token
chainIdNoA comma separated list of chain ids. Example: ?chainId=1,42161
campaignsNoInclude campaign data. Will slow down the request
chainNameNoA comma separated list of chain names. Example: ?chainName=ethereum,arbitrum
campaignIdNoSearch the opportunity linked to a given campaignId
identifierNoFilter by identifier (mainParameter)
maximumAprNoMaximum APR threshold
maximumTvlNoMaximum TVL threshold in USD
minimumAprNoMinimum APR threshold
minimumTvlNoMinimum TVL threshold in USD
tokenTypesNoFilter by token type. Use POINT to include point campaigns and PRETGE to include preTGE campaigns.
creatorSlugNo
programSlugsNoA comma separated list of program ids or slugs. See GET /v4/programs
creatorAddressNoFilter by creator address
mainProtocolIdNoA comma separated list of protocol ids. See GET /v4/protocols
distributionTypesNoFilter by distribution type. Legal values: FIX_REWARD, MAX_REWARD, DUTCH_AUCTION
rewardTokenSymbolNoFilter by opportunity with at least 1 campaign where the reward token has this symbol
excludeSubCampaignsNoExclude sub-campaigns from the results

Output Schema

ParametersJSON Schema
NameRequiredDescription
valueYesMaximum value for the requested field across matching opportunities

TDQS

D1.7/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden, and it discloses nothing: no authentication requirements, no rate limits, no note on whether filters apply before aggregation, and no indication that the path parameter is required. A bare URL template is insufficient for a read tool with 27 parameters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single short line with no padding, but its brevity comes from under-specification rather than efficient communication. Nothing is front-loaded because there is essentially no explanatory content to structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, but for a 27-parameter aggregation endpoint the description provides no information about aggregation semantics, required inputs, or how the extensive filter set interacts with the max computation. It is completely inadequate for this complexity level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 96%, so the schema already documents nearly every parameter thoroughly (including the 'field' parameter with examples like apr, tvl, dailyRewards). The description adds no parameter meaning beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is only a raw REST path, 'GET /v4/opportunities/aggregate/max/{field}', which essentially restates the tool name and title rather than explaining in prose what the tool does. It never states that it returns the maximum value of a numeric field across filtered opportunities, nor does it distinguish this from the sibling opportunities-aggregate-min.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance whatsoever on when to use this aggregate instead of opportunities-aggregate, opportunities-aggregate-min, or opportunities-search. No conditions, prerequisites, or alternatives are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opportunities-aggregate-minAggregate MinD

GET /v4/opportunities/aggregate/min/{field}

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoFilter by name
tagsNoFilter by tag
testNoInclude opportunities with test campaigns
typeNoA comma separated list of Opportunity type
fieldYesNumeric field to compute min on (e.g. apr, tvl, dailyRewards)
pointNoInclude opportunities with point campaigns
actionNoA comma separated list actions. Legal values: POOL,HOLD,DROP,LEND,BORROW,LONG,SHORT,SWAP,INVALID
searchNoSearch amongst multiple values (token, protocols, tags, campaigns)
statusNoA comma separated list of status. Legal values: LIVE,PAST,SOON
tokensNoA comma separated list of token symbol. Use to filter by token
chainIdNoA comma separated list of chain ids. Example: ?chainId=1,42161
campaignsNoInclude campaign data. Will slow down the request
chainNameNoA comma separated list of chain names. Example: ?chainName=ethereum,arbitrum
campaignIdNoSearch the opportunity linked to a given campaignId
identifierNoFilter by identifier (mainParameter)
maximumAprNoMaximum APR threshold
maximumTvlNoMaximum TVL threshold in USD
minimumAprNoMinimum APR threshold
minimumTvlNoMinimum TVL threshold in USD
tokenTypesNoFilter by token type. Use POINT to include point campaigns and PRETGE to include preTGE campaigns.
creatorSlugNo
programSlugsNoA comma separated list of program ids or slugs. See GET /v4/programs
creatorAddressNoFilter by creator address
mainProtocolIdNoA comma separated list of protocol ids. See GET /v4/protocols
distributionTypesNoFilter by distribution type. Legal values: FIX_REWARD, MAX_REWARD, DUTCH_AUCTION
rewardTokenSymbolNoFilter by opportunity with at least 1 campaign where the reward token has this symbol
excludeSubCampaignsNoExclude sub-campaigns from the results

Output Schema

ParametersJSON Schema
NameRequiredDescription
valueYesMinimum value for the requested field across matching opportunities

TDQS

D1.7/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and delivers nothing: no mention of response shape, pagination, auth requirements, rate limits, or what happens when the referenced field is non-numeric. A bare HTTP path is not behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The single-line endpoint string is short but under-specified rather than concise; it wastes the entire description slot on a path that is already implied by the name and title, and front-loads no actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a complex tool with 27 parameters, one required, and no annotations. An output schema exists so return values need not be explained, but the description still omits purpose, usage routing, and any behavioral context, leaving it wholly inadequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 96%, so the schema already documents nearly all 27 parameters including the required 'field' with examples (apr, tvl, dailyRewards). The description adds no parameter meaning beyond what the schema provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is nothing but the raw endpoint path 'GET /v4/opportunities/aggregate/min/{field}'. It restates the tool name rather than explaining what the tool does, and gives no indication of what a 'min' aggregation over a field returns or how it differs from opportunities-aggregate-max beyond the literal word 'min'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus opportunities-aggregate, opportunities-aggregate-max, or opportunities-search. No prerequisites, no conditions, no exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opportunities-bins-aprAPR BinsC

GET /v4/opportunities/bins/apr

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoFilter by name
tagsNoFilter by tag
testNoInclude opportunities with test campaigns
typeNoA comma separated list of Opportunity type
pointNoInclude opportunities with point campaigns
actionNoA comma separated list actions. Legal values: POOL,HOLD,DROP,LEND,BORROW,LONG,SHORT,SWAP,INVALID
searchNoSearch amongst multiple values (token, protocols, tags, campaigns)
statusNoA comma separated list of status. Legal values: LIVE,PAST,SOON
tokensNoA comma separated list of token symbol. Use to filter by token
chainIdNoA comma separated list of chain ids. Example: ?chainId=1,42161
chainNameNoA comma separated list of chain names. Example: ?chainName=ethereum,arbitrum
campaignIdNoSearch the opportunity linked to a given campaignId
identifierNoFilter by identifier (mainParameter)
maximumAprNoMaximum APR threshold
maximumTvlNoMaximum TVL threshold in USD
minimumAprNoMinimum APR threshold
minimumTvlNoMinimum TVL threshold in USD
tokenTypesNoFilter by token type. Use POINT to include point campaigns and PRETGE to include preTGE campaigns.
creatorSlugNo
programSlugsNoA comma separated list of program ids or slugs. See GET /v4/programs
creatorAddressNoFilter by creator address
mainProtocolIdNoA comma separated list of protocol ids. See GET /v4/protocols
distributionTypesNoFilter by distribution type. Legal values: FIX_REWARD, MAX_REWARD, DUTCH_AUCTION
rewardTokenSymbolNoFilter by opportunity with at least 1 campaign where the reward token has this symbol
excludeSubCampaignsNoExclude sub-campaigns from the results

Output Schema

ParametersJSON Schema
NameRequiredDescription
binsYesDistribution of opportunities across APR bins

TDQS

C2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It implies a read-only GET but says nothing about authentication, pagination, rate limits, or what happens if filters are combined. This is only marginally better than no behavioral information.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is extremely short, but that brevity is under-specification rather than conciseness. There is no front-loaded explanation of what the tool does or how to interpret its output, so the single line does not earn its place as an effective description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 25-parameter endpoint with no annotations, the description is insufficiently complete. Although an output schema exists and the input schema has strong coverage, the description still fails to explain the tool's domain purpose, when it should be chosen over siblings, or how APR bins relate to the rest of the opportunities API.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 96% description coverage across 25 parameters, so the schema itself documents nearly all filter semantics. The description adds no parameter meaning beyond the schema, which is acceptable here because the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is only the raw endpoint path 'GET /v4/opportunities/bins/apr'. It restates the tool name/title rather than explaining what an APR bin is or what the tool returns. It does not help an agent distinguish it from sibling opportunities-bins-tvl or the aggregate tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no usage guidance at all. The description does not say when to use APR bins versus TVL bins, aggregate endpoints, or search endpoints, nor does it mention any prerequisites or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opportunities-bins-tvlTVL BinsD

GET /v4/opportunities/bins/tvl

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoFilter by name
tagsNoFilter by tag
testNoInclude opportunities with test campaigns
typeNoA comma separated list of Opportunity type
pointNoInclude opportunities with point campaigns
actionNoA comma separated list actions. Legal values: POOL,HOLD,DROP,LEND,BORROW,LONG,SHORT,SWAP,INVALID
searchNoSearch amongst multiple values (token, protocols, tags, campaigns)
statusNoA comma separated list of status. Legal values: LIVE,PAST,SOON
tokensNoA comma separated list of token symbol. Use to filter by token
chainIdNoA comma separated list of chain ids. Example: ?chainId=1,42161
chainNameNoA comma separated list of chain names. Example: ?chainName=ethereum,arbitrum
campaignIdNoSearch the opportunity linked to a given campaignId
identifierNoFilter by identifier (mainParameter)
maximumAprNoMaximum APR threshold
maximumTvlNoMaximum TVL threshold in USD
minimumAprNoMinimum APR threshold
minimumTvlNoMinimum TVL threshold in USD
tokenTypesNoFilter by token type. Use POINT to include point campaigns and PRETGE to include preTGE campaigns.
creatorSlugNo
programSlugsNoA comma separated list of program ids or slugs. See GET /v4/programs
creatorAddressNoFilter by creator address
mainProtocolIdNoA comma separated list of protocol ids. See GET /v4/protocols
distributionTypesNoFilter by distribution type. Legal values: FIX_REWARD, MAX_REWARD, DUTCH_AUCTION
rewardTokenSymbolNoFilter by opportunity with at least 1 campaign where the reward token has this symbol
excludeSubCampaignsNoExclude sub-campaigns from the results

Output Schema

ParametersJSON Schema
NameRequiredDescription
binsYesDistribution of opportunities across TVL bins

TDQS

D1.4/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It says nothing about read-nature, whether data is live or cached, granularity of TVL bins, ordering, or responses. An endpoint path is not a behavioral specification.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single endpoint string with no structure. While short, it is not front-loaded with any useful information—it is under-specified rather than concise. It fails to earn its place as documentation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 25 parameters and a sibling that handles APR bins, the description is wholly inadequate. It lacks purpose, usage context, and behavioral notes, leaving the agent to reverse-engineer intent from the name and schema. An output schema exists, so return values need not be described, but the description still fails to convey what the tool is for.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 96%, so the schema documents the 25 filter parameters thoroughly with examples and legal values. Per the rubric, baseline 3 applies when schema coverage is high regardless of description content. The description adds no parameter meaning of its own.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose1/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is a bare REST endpoint string, 'GET /v4/opportunities/bins/tvl', which merely restates the tool name and reveals nothing about what the tool does beyond the HTTP verb. It does not describe what a TVL bin is, what data is returned, or how it differs from the sibling 'opportunities-bins-apr'. An agent cannot select this tool confidently from the description alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no usage guidance whatsoever. With 12 sibling tools including opportunities-bins-apr, opportunities-search, and opportunities-aggregate, the description provides no criteria for when to use this tool versus alternatives. The agent must infer everything from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opportunities-campaignsOpportunity CampaignsD

GET /v4/opportunities/{id}/campaigns

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe id of the opportunity. Pattern: (([0-9]*)-([0-9A-Z]*)-(0x([0-9A-Za-z])+))|([0-9]{1,20})
testNoInclude test campaigns
pointNoInclude point campaigns
campaignsNoInclude campaign data. Will slow down the request
tokenTypesNoFilter by token type. Use POINT to include point campaigns and PRETGE to include preTGE campaigns.
excludeSubCampaignsNoExclude sub-campaigns from the results

Output Schema

ParametersJSON Schema
NameRequiredDescription
opportunityYesOpportunity with related campaigns or null if not found

TDQS

D1.8/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden, yet it discloses nothing beyond the endpoint path. It does not mention required permissions, rate limits, response shape, or the fact that sub-campaigns and different token types are involved.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single line with no waste, but that brevity reflects under-specification rather than conciseness. The one sentence that exists conveys almost no actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and schema coverage is complete, which lowers the bar, but for a 6-parameter tool with no annotations and many adjacent campaign/opportunity siblings, a bare endpoint path leaves the agent without enough context to choose or invoke it confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all six parameters (including the note that 'campaigns' slows the request). The description adds no parameter meaning beyond the schema, which is the baseline expectation at full coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is a raw HTTP endpoint path, "GET /v4/opportunities/{id}/campaigns", which essentially restates the tool name in URL form rather than stating in plain language what the tool does. It hints at retrieving campaigns for an opportunity but provides no verb+resource phrasing that distinguishes it from siblings like campaigns-search or opportunities-get.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance whatsoever about when to use this tool versus the many sibling tools (campaigns-search, campaigns-get, campaigns-count, opportunities-get). No conditions, prerequisites, or exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opportunities-countCount OpportunitiesC

GET /v4/opportunities/count

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoFilter by name
tagsNoFilter by tag
testNoInclude opportunities with test campaigns
typeNoA comma separated list of Opportunity type
pointNoInclude opportunities with point campaigns
actionNoA comma separated list actions. Legal values: POOL,HOLD,DROP,LEND,BORROW,LONG,SHORT,SWAP,INVALID
searchNoSearch amongst multiple values (token, protocols, tags, campaigns)
statusNoA comma separated list of status. Legal values: LIVE,PAST,SOON
tokensNoA comma separated list of token symbol. Use to filter by token
chainIdNoA comma separated list of chain ids. Example: ?chainId=1,42161
campaignsNoInclude campaign data. Will slow down the request
chainNameNoA comma separated list of chain names. Example: ?chainName=ethereum,arbitrum
campaignIdNoSearch the opportunity linked to a given campaignId
identifierNoFilter by identifier (mainParameter)
maximumAprNoMaximum APR threshold
maximumTvlNoMaximum TVL threshold in USD
minimumAprNoMinimum APR threshold
minimumTvlNoMinimum TVL threshold in USD
tokenTypesNoFilter by token type. Use POINT to include point campaigns and PRETGE to include preTGE campaigns.
creatorSlugNo
programSlugsNoA comma separated list of program ids or slugs. See GET /v4/programs
creatorAddressNoFilter by creator address
mainProtocolIdNoA comma separated list of protocol ids. See GET /v4/protocols
distributionTypesNoFilter by distribution type. Legal values: FIX_REWARD, MAX_REWARD, DUTCH_AUCTION
rewardTokenSymbolNoFilter by opportunity with at least 1 campaign where the reward token has this symbol
excludeSubCampaignsNoExclude sub-campaigns from the results

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNumber of opportunities matching the filters

TDQS

C2.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden, yet it only supplies the HTTP method GET. This hints at a read-only operation, but it says nothing about authentication, rate limits, idempotency, or what the count represents.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely short, but it is under-specified rather than efficiently concise. A single endpoint path does not front-load useful information about purpose, filtering, or behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 26 optional filtering parameters, no annotations, and no output schema explanation in the description, a bare endpoint path is completely inadequate. An agent cannot tell when to use it, what it returns, or how it differs from sibling count or search tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 96%, so the input schema already documents nearly all 26 filter parameters thoroughly. The description adds no parameter meaning beyond the endpoint path, which is acceptable only because the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is only the HTTP method and endpoint path, which essentially restates the tool name and title without explaining what is counted or how it relates to similar tools. It does not distinguish this count endpoint from siblings such as opportunities-search, opportunities-get, or opportunities-aggregate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives, nor any mention of prerequisites, filtering intent, or expected context. The agent receives no explicit or implied usage rules beyond the endpoint name itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opportunities-getGet OpportunityD

GET /v4/opportunities/{id}

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe id of the opportunity. Pattern: (([0-9]*)-([0-9A-Z]*)-(0x([0-9A-Za-z])*))|([0-9]{1,20})
testNoInclude test campaigns
pointNoInclude point campaigns
campaignsNoInclude campaign data. Will slow down the request
tokenTypesNoFilter by token type. Use POINT to include point campaigns and PRETGE to include preTGE campaigns.
excludeSubCampaignsNoExclude sub-campaigns from the results

Output Schema

ParametersJSON Schema
NameRequiredDescription
opportunityYesOpportunity object or null if not found

TDQS

D1.8/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden, yet it discloses nothing: no auth requirements, no rate limits, no note that this is a read-only operation, no indication of what the optional include flags do to the response. The one useful behavioral hint ('Will slow down the request' for campaigns) lives only in the schema, not the description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is short, but that brevity is under-specification rather than conciseness: a single route fragment with no front-loaded statement of purpose, scope, or return behavior. Nothing is wasted because nothing is said.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, but for a 6-parameter read tool with zero annotations the description should at minimum state the resource semantics and how the include/filter flags shape the result. It provides none of that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all six parameters including the id pattern and the tokenTypes filter semantics. The description adds no meaning beyond the schema, which is the baseline-3 case.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is a raw REST route ('GET /v4/opportunities/{id}') that restates the tool name rather than explaining what an opportunity is or what the call returns. It implies a single-resource fetch but gives no differentiation from siblings like opportunities-search or opportunities-campaigns, which share the same resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance whatsoever on when to use this tool versus opportunities-search, opportunities-campaigns, or the aggregate siblings. The agent must infer usage entirely from the path string and the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 13 tool updatesv0.1.9
    • First observedcampaigns-count
    • First observedcampaigns-get
    • First observedcampaigns-search
    • First observedget-current-timestamp
    • First observedopportunities-aggregate
    • First observedopportunities-aggregate-max
    • First observedopportunities-aggregate-min
    • First observedopportunities-bins-apr
    • First observedopportunities-bins-tvl
    • First observedopportunities-campaigns
    • First observedopportunities-count
    • First observedopportunities-get
    • First observedopportunities-search

TDQS

C2.6/5.0

Scored across 13 tools

Disambiguation4/5

Most tools are clearly separated by resource (campaigns vs opportunities) and action (search, get, count). The aggregate/max/min family is slightly overlapping in purpose, and get-current-timestamp is unrelated to the domain, but an agent can still distinguish the primary operations.

Naming Consistency4/5

The set uses kebab-case consistently and mostly follows a predictable resource-action or resource-subresource-action pattern. The main deviation is get-current-timestamp, which reverses the verb-noun ordering used elsewhere.

Tool Count5/5

With 13 tools, the server is well-scoped for a read-only API surface covering campaigns and opportunities. Each tool maps to a distinct query capability without excessive bloat.

Completeness4/5

The surface covers search, get, count, aggregation, and bin queries for opportunities, plus search/get/count for campaigns. It appears complete for a read-only API, though a few less-common query endpoints may still be missing.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    MCP server that exposes unified AI-friendly tools over Messari's standardized lending subgraphs on The Graph. One natural-language query → fan out across 40+ lending protocols on multiple chains → get back structured, comparable data.
    19
    7 npm
    1
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    MCP server for Hyperliquid that provides read-only on-chain wallet analytics. Enables natural-language queries about positions, fills, funding, and realized PnL for any public address.
    8
    7 npm
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Universal MCP server for Mantle yield data, enabling users to fetch health status, dashboard summaries, and detailed opportunity information through natural language.
    7
    -
  • A
    license
    B
    quality
    C
    maintenance
    MCP server to query Polymarket prediction market data via The Graph subgraphs and REST APIs, enabling AI agents to search markets, get live prices, order books, on-chain analytics, and trader profiles.
    32
    77 npm
    MIT