MCP tools
Alerts, notifications, tags and billing
MCP tools for keyword alerts and the notifications they raise, tender tags and the billing summary.
A keyword alert is a saved tender search query. The platform checks it three times a day, and every open tender it newly matches becomes a notification that your whole organization sees. These tools manage the alerts, read and clear the notifications, create the tags you label tenders with, and read the billing summary. The alert pages of the app are explained in Keyword alerts.
| Tool | What it does |
|---|---|
| alerts_list | List keyword alerts |
| alerts_create | Create a keyword alert |
| alerts_update | Update a keyword alert |
| alerts_delete | Delete a keyword alert |
| notifications_list | List notifications |
| notifications_mark_read | Mark notifications read |
| notifications_clear | Clear all notifications |
| tags_list | List tags |
| tags_create | Create a tag |
| tags_update | Update a tag |
| tags_delete | Delete a tag |
| billing_get | Get the billing summary |
Keyword alerts
Alerts are shared by the whole organization: what a colleague creates, you can see, change and delete.
alerts_list
Lists your organization's keyword alerts, newest first. Use it to see what is already being watched before you add another, or to find the ID of an alert to pause or delete.
Read-only · scope alerts.read · all roles · Pro and Enterprise plans
No parameters.
Returns: An alerts list with no paging, each alert carrying id, keyword, is_active, last_triggered_at and created_at.
- Paused alerts are listed too;
is_activetells them apart.
alerts_create
Creates a keyword alert from a tender search query. The alert starts active unless you say otherwise, and each new open tender that the same search would find raises a notification.
Changes data · scope alerts.write · roles: owner, admin, sales, purchasing · Pro and Enterprise plans
| Parameter | Type | Required | Description |
|---|---|---|---|
keyword | string | Yes | The tender search query to watch, 1 to 200 characters. It takes the same syntax as q in tenders_list: plain words, OR, item:(gauze AND sterile), agency:, a leading - to exclude a word, and quoted phrases. An invalid query is refused. |
is_active | boolean | No | Whether the alert starts active. Defaults to true. |
{
"keyword": "item:(gauze AND sterile)",
"is_active": true
}Returns: The new alert, with its ID, query and state.
- A query that could never match is refused when you save it: an unknown search field, a query made only of exclusions, or a syntax error such as an unclosed parenthesis. Fix the query and call again.
- Your plan limits how many alerts can be active at once: 10 on Starter, 100 on Pro, unlimited on Enterprise. At the limit the tool answers
plan_limit_reachedwithlimitandcurrent. A paused alert does not count. - An alert fires only on open tenders (one with no closing date counts as open), and once per tender. A plain word is matched against the tender's name, numbers and items, not its agency name: write
agency:to follow an agency. - The alert is credited to the member who connected, and the email and WhatsApp copies of its matches go to that member.
alerts_update
Changes an alert's query, or pauses and resumes it. Only what you send changes, and at least one of keyword and is_active is needed.
Changes data · scope alerts.write · roles: owner, admin, sales, purchasing · Pro and Enterprise plans
| Parameter | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | The alert's ID, from alerts_list. |
keyword | string | No | The new query, 1 to 200 characters, checked by the same rules as in alerts_create. |
is_active | boolean | No | false pauses the alert and true resumes it. A paused alert fires nothing and does not count toward your plan limit. |
{
"id": 27,
"keyword": "item:(gauze AND sterile)",
"is_active": true
}Returns: The alert after the change.
- Sending the ID without
keywordoris_activeanswers 400. An ID that is not one of your organization's alerts answers 404.
alerts_delete
Deletes a keyword alert for good; the notifications it already raised stay in the list. To stop it only for a while, use alerts_update with is_active set to false.
Deletes or overwrites data · scope alerts.write · roles: owner, admin, sales, purchasing · Pro and Enterprise plans
| Parameter | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | The alert's ID, from alerts_list. |
Returns: A confirmation, success: true.
- An ID that is not one of your organization's alerts answers 404.
Notifications
Notifications are shared by the organization. They come from keyword alerts, from product alerts built on your catalog, and from deadline reminders for the tenders your team has starred or is working on.
notifications_list
Lists your organization's notifications, newest first, each with the tender that raised it, plus the total unread count. Use unread_only to see just what is new, or count_only when only the number matters.
Read-only · scope notifications.read · all roles · Pro and Enterprise plans
| Parameter | Type | Required | Description |
|---|---|---|---|
unread_only | boolean | No | true lists only notifications not yet marked read. |
count_only | boolean | No | true returns only unread_count and no list, and ignores paging and unread_only. |
page | integer | No | Page number, starting at 1. |
page_size | integer | No | Results per page: 20 by default, 100 at most. |
Returns: A page of notifications in data, with total, page, page_size, total_pages and unread_count. Each notification carries id, match_type (keyword, product or deadline), match_text, is_read, created_at, tender_id and a tenders object with tender_name, agency_name and source. With count_only, only unread_count comes back.
- Cleared notifications and those older than 30 days are not listed.
unread_countcounts every visible unread notification in the organization, not only those on the page.
notifications_mark_read
Marks one notification as read, or every unread one at once. Send exactly one of id and all.
Changes data · scope notifications.write · roles: owner, admin, sales, purchasing · Pro and Enterprise plans
| Parameter | Type | Required | Description |
|---|---|---|---|
id | integer | No | The ID of the notification to mark, from notifications_list. |
all | boolean | No | true marks every unread notification in the organization as read. If id is sent too, all wins. |
Returns: A confirmation, success: true.
- Sending neither
idnorallanswers 400. An ID that is not one of your organization's notifications changes nothing, and the call still reports success.
notifications_clear
Clears the whole notification list for your organization, for every member at once. The notifications disappear from every screen and cannot be brought back.
Deletes or overwrites data · scope notifications.write · roles: owner, admin, sales, purchasing · Pro and Enterprise plans
No parameters.
Returns: success: true and cleared, the number of notifications removed from the list.
- Matching itself is unaffected: a tender that already notified you does not notify you again after a clear.
- Without a clear, notifications leave the list on their own after 30 days.
Tags
Tags are labels your organization puts on tenders, such as a product line or a customer, and every member shares them. These tools manage the tags themselves; putting a tag on a tender is done from the tender page in the app, as described in The tender page.
tags_list
Lists your organization's tags in alphabetical order. Send a tender's ID to see which of them are on that tender.
Read-only · scope tags.read · all roles · Pro and Enterprise plans
| Parameter | Type | Required | Description |
|---|---|---|---|
tender_id | integer | No | A tender's ID. When sent, each tag also carries assigned: true if the tender has that tag. |
Returns: A tags list, each with id, name and color, plus assigned when tender_id was sent.
- A
tender_idthat is not a positive integer answers 400.
tags_create
Creates a new tag for labelling tenders. A tag's name is unique within the organization.
Changes data · scope tags.write · roles: owner, admin, sales, purchasing · Pro and Enterprise plans
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes | The tag's name, 1 to 100 characters. Spaces at either end are trimmed. |
color | string | No | A hex colour such as #16a34a, up to 20 characters. Blue (#3b82f6) when omitted. |
{
"name": "Syringes lot",
"color": "#16a34a"
}Returns: The new tag.
- A repeated name answers 409 with the message
Tag already exists.
tags_update
Renames a tag or changes its colour. The change shows on every tender that carries the tag, since it is one tag.
Changes data · scope tags.write · roles: owner, admin, sales, purchasing · Pro and Enterprise plans
| Parameter | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | The tag's ID, from tags_list. |
name | string | No | The new name, 1 to 100 characters. |
color | string | No | The new hex colour, up to 20 characters. |
{
"id": 14,
"name": "Syringes 2026",
"color": "#16a34a"
}Returns: The tag after the change.
- Send
nameorcolor, or the tool answers 400. A name already taken answers 409, and an unknown ID answers 404.
tags_delete
Deletes a tag and removes it from every tender that carries it. This cannot be undone.
Deletes or overwrites data · scope tags.write · roles: owner, admin, sales, purchasing · Pro and Enterprise plans
| Parameter | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | The tag's ID, from tags_list. |
Returns: A confirmation, success: true.
- An ID that is not one of your organization's tags answers 404.
Billing
Read-only. Paying, changing the plan or the number of seats and managing payment methods happen in the app only.
billing_get
Reads your organization's plan and subscription: which plan it is on, the subscription status, when the current period ends, and whether custom limits apply. It changes nothing, and only the owner may call it.
Read-only · scope billing.read · roles: owner · Pro and Enterprise plans
No parameters.
Returns: plan_tier (starter, pro or enterprise), subscription_status, current_period_end (an ISO 8601 date, or null when there is no period), has_stripe (whether the organization has a card billing account), has_subscription (whether it has a subscription recorded), has_custom_limits (whether the plan's limits were adjusted for this organization), billing_interval (month or year), and seats: seat_quantity (paid seats of a per-user subscription, or null when the plan is not billed per user), seats_in_use (members plus pending invitations) and user_limit (the most users the organization may hold, -1 for no limit).
plan_tierreadsstarterandsubscription_statusreadsactivewhen the organization has no subscription recorded. Card details are never returned.- For the limits themselves and how much of each you have used, use usage_get.