Market Radar API

MCP server

Connect an AI assistant to the account, to read its radars and set them up in conversation.

The MCP server lets an AI assistant (Claude, Cursor, and any client that speaks the Model Context Protocol) read your radars and newsletters and set them up, in conversation. It is at https://app.trymarketradar.com/api/mcp, over Streamable HTTP. An assistant connects in one of two ways:

  • By signing in, for Claude.ai and ChatGPT: you give it the URL, it sends you to Market Radar, you sign in, pick the workspace and allow. It then acts with your rights: it reads, and it can add companies, create radars and change newsletters.
  • With a key, for clients that take a header (Claude Code, Cursor, Claude Desktop): the URL and a key in the same header as the API. A read key shows the assistant the read tools only; give it a read and write key only if you want it to add companies, create radars and change newsletters.

The MCP server and the API share one rate limit: 60 requests a minute per key, or per assistant signed in. Each tool call is one request; past the limit, the tool answers with an error that says how many seconds to wait.

The tools hold to the account's plan as the API does: a radar, company or custom source past what the plan counts this month is refused with a sentence that says what is over, by how many, and when places free up, such as 2 companies over: the plan counts 40 companies a month, and 40 are used since 1 October. Places free up on 1 November. What a plan leaves to Scale is refused as a Scale feature.

Connecting

Claude.ai: Settings, Connectors, Add custom connector, with the URL above. Claude opens Market Radar's sign-in; sign in, choose the workspace, and allow. On a Team or Enterprise plan, an owner adds the connector once, under the organization's settings, and each member then connects it.

ChatGPT: add a custom app (a connector) with the URL above, in ChatGPT's settings. The same sign-in follows.

Claude Code:

claude mcp add --transport http market-radar https://app.trymarketradar.com/api/mcp \
  --header "Authorization: Bearer <your key>"

Cursor, in ~/.cursor/mcp.json:

{
  "mcpServers": {
    "market-radar": {
      "url": "https://app.trymarketradar.com/api/mcp",
      "headers": { "Authorization": "Bearer <your key>" }
    }
  }
}

Claude Desktop, in claude_desktop_config.json, through the mcp-remote bridge (Node.js needed). The header is passed through env, without a space after the colon, so that no shell splits it:

{
  "mcpServers": {
    "market-radar": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://app.trymarketradar.com/api/mcp", "--header", "Authorization:${MARKET_RADAR_AUTH}"],
      "env": { "MARKET_RADAR_AUTH": "Bearer <your key>" }
    }
  }
}

Other clients: the URL, and either Authorization: Bearer <your key> as a header or the sign-in, which follows the MCP specification's authorization (OAuth 2.1, with client ID metadata documents). A client signing in asks for the scopes the server's 401 names: profile email user:org:read market_radar:mcp. A token without market_radar:mcp is refused with 403 and error="insufficient_scope"; sign in again.

To disconnect an assistant signed in this way, remove it in the assistant.

Tools

ToolArgumentsReturnsAccess
list_radarsnoneEach radar, news, tenders, exchange rates or commodity prices: id, name, its folder, query as a sentence, last sweep, whether a sweep runsRead
list_foldersnoneThe folders, each with its radars' idsRead
create_foldernameThe folder, emptyRead and write
rename_folderfolder_id, nameThe folderRead and write
delete_folderfolder_idThe ids of the folder and of its radars, deleted with itRead and write
list_groupskind? (companies or websites)The groups, each with its members' ids and the radars that follow itRead
create_groupkind, name, member_ids?The groupRead and write
update_groupgroup_id, name?, member_ids? (the whole list)The groupRead and write
delete_groupgroup_idThe ids of the group and of its members, deleted with itRead and write
get_radarradar_idThe radar and its chipsRead
list_signalsradar_id?, since?, query?, limit? (1 to 100, 20 by default)Signals, newest firstRead
get_signalsignal_idThe signal and its sourcesRead
list_companiesnoneThe companies, by name: each one's website, its LinkedIn page and the radars it is onRead
add_companyname, website, linkedin_url?The companyRead and write
list_custom_sourcesnoneThe websites the account searches, and the radars that search eachRead
add_custom_sourcename, addressThe custom sourceRead and write
list_filterssection?The catalogue and the account's own filtersRead
create_radarname, folder_id or folder_name, filters?, topics?, exclude?, company_ids?, group_ids?, own_words?, sources?, custom_source_ids?, source_group_ids?The radar; its first sweep startsRead and write
list_tendersradar_id, status? (open or closed), limit? (1 to 100, 20 by default)A tender radar's calls for tender, newest found firstRead
create_tender_radarname, folder_id or folder_name, countries, words, exclude?The tender radar; its first sweep startsRead and write
get_ratesradar_id, since?An exchange rate radar's pairs: the latest ECB rate, its change over a week and three months, the year's low and high; its interest rates, their changes in basis points; and each rate from sinceRead
create_exchange_rate_radarname, folder_id or folder_name, pairs?, interest_rates?The exchange and interest rate radar; it is never sweptRead and write
get_pricesradar_id, since?A price radar's commodities: the latest price in its unit, its change, the year's low and high, and each price from sinceRead
create_commodity_price_radarname, folder_id or folder_name, commoditiesThe price radar; it is never sweptRead and write
list_newslettersnoneEach newsletter: whether it is live, its schedule, next send, recipients, reviewer and radarsRead
get_newsletternewsletter_idIts settings, and its template: the theme and each block with its idRead
list_issuesnewsletter_id, limit? (1 to 100, 20 by default)Its issues, newest firstRead
get_issuenewsletter_id, issue_id?One issue with its signals, calls, rates and prices, block by block; without issue_id, the one on its way, or else the last sentRead
approve_issuenewsletter_id, issue_idThe issue, approvedRead and write
skip_issuenewsletter_id, issue_idThe issue, skippedRead and write
remove_from_issuenewsletter_id, issue_id, signal_id or tender_idThe issue, without itRead and write
create_newslettername, time_zone?The newsletter, not liveRead and write
update_newsletternewsletter_id, and any of name, cadence, weekday, time, time_zone, subject_pattern, review, reviewer_email, hold_backThe newsletterRead and write
delete_newsletternewsletter_idWhat was deletedRead and write
add_recipientsnewsletter_id, recipientsHow many were addedRead and write
add_blocknewsletter_id, type, after?, and the block's fieldsThe blockRead and write
update_blocknewsletter_id, block_id, and the fields to changeThe blockRead and write
move_blocknewsletter_id, block_id, afterThe templateRead and write
delete_blocknewsletter_id, block_idThe templateRead and write
update_themenewsletter_id, and any of brand_color, text_color, background_color, headings_font, text_font, remove_logoThe themeRead and write

create_radar builds the query the way the app places chips:

ArgumentBecomes
filters: event keys or own filter ids, and own_words: sentences, or { text, terms }One line, as alternatives
topics: topic keysAn AND line, as alternatives
company_ids, and group_ids: company groupsThe AND line of companies, a group as one chip that the radar follows
exclude: mute keys, or any filter keyA NOT line
custom_source_idsThe custom sources it searches, beside the open web
source_group_idsThe website groups it follows, their custom sources searched as they are at each sweep

It needs company_ids, group_ids or own_words, and a folder, as POST /radars does, and reads the open web unless sources says otherwise. Each of own_words is a text chip: a sentence, read, the AI proposing its terms; or { "text": "…", "terms": ["…"] }, the sentence with 1 to 3 terms of your own, searched as given. list_filters shows each own filter's terms and what it keeps. create_tender_radar takes countries as ISO 3166 alpha-3 codes, words to watch for and exclude words that drop a call, as POST /radars with type tenders does, create_exchange_rate_radar takes pairs and interest_rates as type rates does, and create_commodity_price_radar takes commodities as type commodity_prices does. Each takes folder_id, one of the account's folders from list_folders or one create_folder made, or folder_name to make one with the radar. update_group's member_ids replaces the whole list, as PATCH /groups/{id} does. delete_group deletes the group's companies or custom sources with it, as the app does; to delete the group alone, empty it with update_group first. delete_folder deletes the folder's radars with it, as DELETE /folders/{id} does. The server has no tool to edit or delete a radar or a company, or to move a radar out of a folder: do that in the app or through the REST API.

The newsletter tools follow the newsletter endpoints. A few differences suit an assistant:

  • get_issue without issue_id reads the issue on its way: the one to approve.
  • get_newsletter lists each block of the template with its id, so the assistant can name one to update_block, move_block or delete_block. add_block and update_block take every type's fields as arguments; a field the block's type has not is refused, naming it. A text block takes text, plain.
  • delete_newsletter and delete_block are marked destructive, so an assistant asks you before it calls them. The server has no tool to remove a recipient: do that in the app or through the REST API.
  • Live is turned on and off in the app only.

Every tool answers with structured JSON (the objects) and a short text an assistant can quote. Examples of what to ask:

  • What happened at our competitors this week? (list_signals with since)
  • Summarise the M&A signals on Competitors and AI since September.
  • Add Revolut, revolut.com, and create a radar for its product launches and partnerships.
  • Which calls for tender on solar carports close this month? (list_tenders with status open)
  • How has the euro moved against the dollar and the yuan since July? (get_rates with since)
  • How have nickel and cobalt moved this quarter? (get_prices)
  • What goes out in Monday's brief? Approve it without the second item. (get_issue, remove_from_issue, approve_issue)
  • Add a Calls for tender section to the weekly newsletter, after Competitors. (add_block)

On this page