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
| Tool | Arguments | Returns | Access |
|---|---|---|---|
list_radars | none | Each radar, news, tenders, exchange rates or commodity prices: id, name, its folder, query as a sentence, last sweep, whether a sweep runs | Read |
list_folders | none | The folders, each with its radars' ids | Read |
create_folder | name | The folder, empty | Read and write |
rename_folder | folder_id, name | The folder | Read and write |
delete_folder | folder_id | The ids of the folder and of its radars, deleted with it | Read and write |
list_groups | kind? (companies or websites) | The groups, each with its members' ids and the radars that follow it | Read |
create_group | kind, name, member_ids? | The group | Read and write |
update_group | group_id, name?, member_ids? (the whole list) | The group | Read and write |
delete_group | group_id | The ids of the group and of its members, deleted with it | Read and write |
get_radar | radar_id | The radar and its chips | Read |
list_signals | radar_id?, since?, query?, limit? (1 to 100, 20 by default) | Signals, newest first | Read |
get_signal | signal_id | The signal and its sources | Read |
list_companies | none | The companies, by name: each one's website, its LinkedIn page and the radars it is on | Read |
add_company | name, website, linkedin_url? | The company | Read and write |
list_custom_sources | none | The websites the account searches, and the radars that search each | Read |
add_custom_source | name, address | The custom source | Read and write |
list_filters | section? | The catalogue and the account's own filters | Read |
create_radar | name, 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 starts | Read and write |
list_tenders | radar_id, status? (open or closed), limit? (1 to 100, 20 by default) | A tender radar's calls for tender, newest found first | Read |
create_tender_radar | name, folder_id or folder_name, countries, words, exclude? | The tender radar; its first sweep starts | Read and write |
get_rates | radar_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 since | Read |
create_exchange_rate_radar | name, folder_id or folder_name, pairs?, interest_rates? | The exchange and interest rate radar; it is never swept | Read and write |
get_prices | radar_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 since | Read |
create_commodity_price_radar | name, folder_id or folder_name, commodities | The price radar; it is never swept | Read and write |
list_newsletters | none | Each newsletter: whether it is live, its schedule, next send, recipients, reviewer and radars | Read |
get_newsletter | newsletter_id | Its settings, and its template: the theme and each block with its id | Read |
list_issues | newsletter_id, limit? (1 to 100, 20 by default) | Its issues, newest first | Read |
get_issue | newsletter_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 sent | Read |
approve_issue | newsletter_id, issue_id | The issue, approved | Read and write |
skip_issue | newsletter_id, issue_id | The issue, skipped | Read and write |
remove_from_issue | newsletter_id, issue_id, signal_id or tender_id | The issue, without it | Read and write |
create_newsletter | name, time_zone? | The newsletter, not live | Read and write |
update_newsletter | newsletter_id, and any of name, cadence, weekday, time, time_zone, subject_pattern, review, reviewer_email, hold_back | The newsletter | Read and write |
delete_newsletter | newsletter_id | What was deleted | Read and write |
add_recipients | newsletter_id, recipients | How many were added | Read and write |
add_block | newsletter_id, type, after?, and the block's fields | The block | Read and write |
update_block | newsletter_id, block_id, and the fields to change | The block | Read and write |
move_block | newsletter_id, block_id, after | The template | Read and write |
delete_block | newsletter_id, block_id | The template | Read and write |
update_theme | newsletter_id, and any of brand_color, text_color, background_color, headings_font, text_font, remove_logo | The theme | Read and write |
create_radar builds the query the way the app places chips:
| Argument | Becomes |
|---|---|
filters: event keys or own filter ids, and own_words: sentences, or { text, terms } | One line, as alternatives |
topics: topic keys | An AND line, as alternatives |
company_ids, and group_ids: company groups | The AND line of companies, a group as one chip that the radar follows |
exclude: mute keys, or any filter key | A NOT line |
custom_source_ids | The custom sources it searches, beside the open web |
source_group_ids | The 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_issuewithoutissue_idreads the issue on its way: the one to approve.get_newsletterlists each block of the template with its id, so the assistant can name one toupdate_block,move_blockordelete_block.add_blockandupdate_blocktake every type's fields as arguments; a field the block's type has not is refused, naming it. A text block takestext, plain.delete_newsletteranddelete_blockare 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_signalswithsince) - 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_tenderswithstatusopen) - How has the euro moved against the dollar and the yuan since July? (
get_rateswithsince) - 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)