You are an investment research and deal sourcing assistant with access to Specter, a B2B intelligence platform for company, investor, and people data — due diligence, portfolio monitoring, competitive analysis, relationship mapping.
## Workflow
Resolve to an external ID first; most tools need one. Companies are 24-char hex (`5f3a2b1c...`), people `per_...`, investors `inv_...`. Use `find_company` / `find_person` / `find_investor` (name, domain, email, LinkedIn URL); cache the IDs.
Open-ended discovery ("fintech in Germany", "climate-focused VC investors"): `search`; set `product` if known, else omit to infer it.
Saved lists/searches: `get_lists` / `get_saved_searches` for IDs, then `get_list_items` / `get_saved_search_items`.
Company overview: `get_company_profile` + `get_company_intelligence`, then `get_company_funding_rounds` / `_acquisitions` / `_ipos` / `_latest_revenue` / `_latest_valuation` / `_news_signals` / `_investor_interest_signals`.
People: `get_person_profile`, `get_person_talent_signals`, `get_person_email`. Investors: `get_investor_profile`, `get_investor_funding_rounds`, `get_investor_interest_signals`.
Competition — "who competes with X" — `get_company_competitors`: ranked rivals, the dimensions the market splits on, an analyst summary. Reach for it unprompted whenever a request is about competition.
Signal and transaction tools take `date_from` / `date_to`; bound them when time-scoped.
Writes: `create_list`, `update_list` (rename, add/remove items), `delete_list`, `create_saved_search`, `delete_saved_search`. Confirm before deleting.
## Behavior
- Lead with the most actionable insight, not raw data.
- Follow-ups on an entity already shown: use the cached ID; don't re-render the memo.
- Comparisons: side-by-side tables (founded, HQ, employees, total funding, last round, growth stage, differentiators).
- Don't re-describe a table in prose after showing it. Omit null/empty fields silently.
Per-tool descriptions carry rendering rules — fol
Discoverability
3/6 passed3 of 6 passed50/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 MCP Server Card declares this server's exact endpoint.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Find ONE SPECIFIC company you can already name — by external ID, LinkedIn URL, website/domain, or exact name — and return its core profile. This is a quick LOOKUP of a known entity, not a search: for any descriptive query ('fintech companies in Berlin', 'startups doing X') use `search` / `create_saved_search` instead — a description passed here resolves to nothing. Prefer the company's primary domain when you know it ('Stripe' -> `stripe.com`): it identifies the company exactly, where a bare name has to be disambiguated against every other company sharing it. Do NOT guess a domain by appending '.com'; pass the plain name instead.
Render: hyperlink `name` to `https://app.tryspecter.com/companies/all/{external_company_id}/overview`. Show `website` and `linkedin_url` as clickable links. Omit null fields.
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.
identifier
Company external ID, LinkedIn URL, website/domain (preferred), or company name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"type": "object",
"required": [
"external_company_id"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Company name."
},
"domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Company domain."
},
"website": {
"anyOf": [
{
"type": "string",
"format": "uri",
"maxLength": 2083,
"minLength": 1
},
{
"type": "null"
}
],
"default": null,
"description": "Company website URL."
},
"linkedin_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Company LinkedIn URL."
},
"match_verdict": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Present only when the reference did NOT identify this company exactly — it then says what actually happened and what to do about it. Read it before using anything else in this result."
},
"external_company_id": {
"type": "string",
"pattern": "[a-f0-9]{24}",
"description": "Specter organization ID (company ID)."
}
},
"description": "`find_company`'s answer: one company, plus what the caller has to know\nwhen the reference did not actually identify it.\n\nThe caveat lives here rather than on the shared core model — every other\ncompany response is reached by an id that already resolved, so carrying a\nverdict field on those would be noise the caller has to ignore."
}
Original tool metadata
{
"name": "find_company",
"title": "Find Company",
"description": "Find ONE SPECIFIC company you can already name — by external ID, LinkedIn URL, website/domain, or exact name — and return its core profile. This is a quick LOOKUP of a known entity, not a search: for any descriptive query ('fintech companies in Berlin', 'startups doing X') use `search` / `create_saved_search` instead — a description passed here resolves to nothing. Prefer the company's primary domain when you know it ('Stripe' -> `stripe.com`): it identifies the company exactly, where a bare name has to be disambiguated against every other company sharing it. Do NOT guess a domain by appending '.com'; pass the plain name instead.\n\nRender: hyperlink `name` to `https://app.tryspecter.com/companies/all/{external_company_id}/overview`. Show `website` and `linkedin_url` as clickable links. Omit null fields.",
"inputSchema": {
"type": "object",
"required": [
"identifier"
],
"properties": {
"identifier": {
"anyOf": [
{
"type": "string",
"pattern": "[a-f0-9]{24}"
},
{
"type": "string",
"pattern": "^(?:https?://(?:www\\.)?)?linkedin\\.com/(?:companies|school|company|edu|showcase|organization|organization-guest\\/company)/[^/?#\\s]+"
},
{
"type": "string"
}
],
"description": "Company external ID, LinkedIn URL, website/domain (preferred), or company name."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"external_company_id"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Company name."
},
"domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Company domain."
},
"website": {
"anyOf": [
{
"type": "string",
"format": "uri",
"maxLength": 2083,
"minLength": 1
},
{
"type": "null"
}
],
"default": null,
"description": "Company website URL."
},
"linkedin_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Company LinkedIn URL."
},
"match_verdict": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Present only when the reference did NOT identify this company exactly — it then says what actually happened and what to do about it. Read it before using anything else in this result."
},
"external_company_id": {
"type": "string",
"pattern": "[a-f0-9]{24}",
"description": "Specter organization ID (company ID)."
}
},
"description": "`find_company`'s answer: one company, plus what the caller has to know\nwhen the reference did not actually identify it.\n\nThe caveat lives here rather than on the shared core model — every other\ncompany response is reached by an id that already resolved, so carrying a\nverdict field on those would be noise the caller has to ignore."
},
"annotations": {
"title": "Find Company",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
Get a detailed company profile by Specter organization ID. First-time presentation: render as a mini investment memo.
Memo skeleton (skip empty sections):
1. Snapshot — name (linked to `website`), HQ, founded, employees, growth_stage, total_funding, monthly web visits.
2. What They Do — short_description, typical_customer_profile, traction.
3. Industry & Tech Verticals — see below.
4. Funding History — table (call `get_company_funding_rounds`; add `get_company_acquisitions` / `get_company_ipos` when the company has exited).
5. Investor Signals — table (call `get_company_intelligence`).
6. Team — founders + key people (call `get_company_intelligence`).
7. Headcount — most recent month (call `get_company_intelligence`).
8. Reported Clients.
Hyperlink `name` to `https://app.tryspecter.com/companies/all/{external_company_id}/overview`. Show `linkedin_url` as a clickable link. Omit null fields. Render `traction` as a bullet list, not the raw comma-separated string.
Industry & Tech Verticals (proprietary dual-lens classification, complementary — show both when present):
- `industry`: 3-level economic-activity hierarchy (21 L1 → L2 → L3). Render with ` > ` separator.
- `tech_verticals`: 2-level tech-domain hierarchy (33 verticals → 300+ sub-verticals). Render with ` > ` separator.
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.
external_company_id
Specter external ID for the company.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Get the funding rounds a company raised by Specter organization ID, with per-round valuations and the investors on each round. Supports date-range filtering (`date_from` / `date_to`, on the announcement date) and pagination.
Render as a table: Date | Round | Raised | Lead Investors | Post-Money Valuation. Write "Undisclosed" when `post_money_valuation_usd` is null. Rounds are ordered newest first. When `total` exceeds the returned count, offer to fetch the next page. Omit null fields.
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.
external_company_id
Specter external ID for the company.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
date_from
Only return rounds announced on or after this date (YYYY-MM-DD, inclusive).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
date_to
Only return rounds announced on or before this date (YYYY-MM-DD, inclusive).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
0-based page number.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Max rounds per page (1-50).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Get the acquisitions a company is party to by Specter organization ID — deals where it is the **acquirer** and deals where it is the **acquired** company, in one feed. Supports date-range filtering (`date_from` / `date_to`, on the deal date) and pagination.
Render as a table: Date | Acquirer | Acquired | Type | Price. State which side the queried company is on; write "Undisclosed" when `price_usd` is null. Deals are ordered newest first. When `total` exceeds the returned count, offer to fetch the next page. Omit null fields.
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.
external_company_id
Specter external ID for the company.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
date_from
Only return deals dated on or after this date (YYYY-MM-DD, inclusive).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
date_to
Only return deals dated on or before this date (YYYY-MM-DD, inclusive).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
0-based page number.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Max deals per page (1-50).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Get a company's IPO events by Specter organization ID: listing date, exchange and ticker, share price, and the valuation and capital raised at listing. Supports pagination.
Render as a table: Date | Exchange | Ticker | Share Price | Valuation | Raised. Events are ordered most recent first. A company with no public listing returns an empty `ipos`. Omit null fields.
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.
external_company_id
Specter external ID for the company.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
0-based page number.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Max IPO events per page (1-50).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Get company intelligence by Specter organization ID: department headcount, investor signals, key people, founders, highlights, and the latest revenue and valuation estimates.
Headcount: from `headcount_by_department`, show only the most recent month as a table (department, count, % of total). Highlight engineering % as an R&D investment proxy.
Investor signals: render as a table (Date | Source | Score | Type). Scores 1-10. Include description when present.
Team: render founders and key people with background highlights.
Highlights: translate to plain English bullets.
Financial position: `latest_revenue` and `latest_valuation` are already here — no follow-up call needed. Report revenue with its period and valuation with its date, and say plainly when either is null; an absent figure is not zero.
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.
external_company_id
Specter external ID for the company.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Competitive landscape for a Specter company ID: the top competitors ranked by competitiveness, the dimensions the market splits on, and an analyst summary. Competitiveness balances similarity with commercial scale (funding, revenue, headcount).
Render competitors as a table (name, score, dimensions, focus, funding, employees, est. revenue, est. valuation); hyperlink each `name` to `https://app.tryspecter.com/companies/all/{external_company_id}/overview`. Format funding/revenue/valuation compactly (e.g. $120M). `focus` is always present; omit other null fields.
Show the top 10 rows by default — inside a wider company write-up too, where the table is never what gets shortened to save room — and more only when the user asks. The chat offers the full ranked set on the company's profile, so never apologise for the cut or list the remainder in prose.
When `insufficient_data` is true, say Specter doesn't hold enough on this company yet to analyse its market — never present that as the company having no competitors, and don't ask the user to supply the competitor set for you.
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.
external_company_id
Specter external ID for the company.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"type": "object",
"required": [
"competitors"
],
"properties": {
"summary": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Analyst briefing of the competitive landscape."
},
"dimensions": {
"type": "array",
"items": {
"type": "string"
},
"description": "The competitive axes this market splits on."
},
"competitors": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"focus"
],
"properties": {
"name": {
"type": "string",
"description": "Competitor name."
},
"focus": {
"type": "string",
"description": "Terse 'what they're best at' (specialty); always present."
},
"domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Competitor domain."
},
"dimensions": {
"type": "array",
"items": {
"type": "string"
},
"description": "Competitive dimensions this company matches."
},
"employee_count": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Number of employees."
},
"estimated_revenue": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Estimated annual revenue (USD)."
},
"estimated_valuation": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Estimated valuation (USD)."
},
"external_company_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Specter company ID, when the competitor is in our DB."
},
"total_funding_amount": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Total funding raised (USD)."
},
"competitiveness_score": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "0.0-1.0 — how directly it competes (higher = closer rival). Render it on the product's 1-10 scale (score x 10, one decimal at most), never the raw decimal."
}
}
},
"description": "Competitors ranked by competitiveness (closest first)."
},
"insufficient_data": {
"type": "boolean",
"default": false,
"description": "True when Specter holds too little on this company to analyse a landscape at all (no description and no similar companies). An empty `competitors` list under this flag means the data is missing, NOT that the company has no competitors."
}
}
}
Original tool metadata
{
"name": "get_company_competitors",
"title": "Get Company Competitors",
"description": "Competitive landscape for a Specter company ID: the top competitors ranked by competitiveness, the dimensions the market splits on, and an analyst summary. Competitiveness balances similarity with commercial scale (funding, revenue, headcount).\n\nRender competitors as a table (name, score, dimensions, focus, funding, employees, est. revenue, est. valuation); hyperlink each `name` to `https://app.tryspecter.com/companies/all/{external_company_id}/overview`. Format funding/revenue/valuation compactly (e.g. $120M). `focus` is always present; omit other null fields.\n\nShow the top 10 rows by default — inside a wider company write-up too, where the table is never what gets shortened to save room — and more only when the user asks. The chat offers the full ranked set on the company's profile, so never apologise for the cut or list the remainder in prose.\n\nWhen `insufficient_data` is true, say Specter doesn't hold enough on this company yet to analyse its market — never present that as the company having no competitors, and don't ask the user to supply the competitor set for you.",
"inputSchema": {
"type": "object",
"required": [
"external_company_id"
],
"properties": {
"external_company_id": {
"type": "string",
"pattern": "[a-f0-9]{24}",
"description": "Specter external ID for the company."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"competitors"
],
"properties": {
"summary": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Analyst briefing of the competitive landscape."
},
"dimensions": {
"type": "array",
"items": {
"type": "string"
},
"description": "The competitive axes this market splits on."
},
"competitors": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"focus"
],
"properties": {
"name": {
"type": "string",
"description": "Competitor name."
},
"focus": {
"type": "string",
"description": "Terse 'what they're best at' (specialty); always present."
},
"domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Competitor domain."
},
"dimensions": {
"type": "array",
"items": {
"type": "string"
},
"description": "Competitive dimensions this company matches."
},
"employee_count": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Number of employees."
},
"estimated_revenue": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Estimated annual revenue (USD)."
},
"estimated_valuation": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Estimated valuation (USD)."
},
"external_company_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Specter company ID, when the competitor is in our DB."
},
"total_funding_amount": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Total funding raised (USD)."
},
"competitiveness_score": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "0.0-1.0 — how directly it competes (higher = closer rival). Render it on the product's 1-10 scale (score x 10, one decimal at most), never the raw decimal."
}
}
},
"description": "Competitors ranked by competitiveness (closest first)."
},
"insufficient_data": {
"type": "boolean",
"default": false,
"description": "True when Specter holds too little on this company to analyse a landscape at all (no description and no similar companies). An empty `competitors` list under this flag means the data is missing, NOT that the company has no competitors."
}
}
},
"annotations": {
"title": "Get Company Competitors",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Get news signals attributed to a company by Specter organization ID: funding, revenue, traction, profit, and deal updates surfaced from news coverage. Supports date-range filtering (`date_from` / `date_to`, on the article publication date) and pagination.
Render as a table: Date | Title (hyperlinked to `article_url`) | Updates | Score | What's New. Scores are 1-10 (>= 4 is major news). Signals are ordered most-recent first. When `total` exceeds the number of returned signals, offer to fetch the next page.
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.
external_company_id
Specter external ID for the company.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
date_from
Only return signals published on or after this date (YYYY-MM-DD, inclusive).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
date_to
Only return signals published on or before this date (YYYY-MM-DD, inclusive).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
0-based page number.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Max signals per page (1-50).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Get investor-interest signals for a company by Specter organization ID: the funding, growth, and market-activity signals that indicate investor attention on that company. Supports date-range filtering (`date_from` / `date_to`, on the signal date) and pagination.
Render as a table: Date | Score | Type | Summary. Scores are 1-10. Signals are ordered newest first. `signal_investors` names the investors behind a signal — offer `get_investor_profile` for any of them. Omit null fields.
`get_company_intelligence` returns a short inline preview of the same signals; use this tool when the full or date-filtered feed is wanted.
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.
external_company_id
Specter external ID for the company.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
date_from
Only return signals dated on or after this date (YYYY-MM-DD, inclusive).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
date_to
Only return signals dated on or before this date (YYYY-MM-DD, inclusive).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
0-based page number.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Max signals per page (1-50).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Get a company's latest revenue by Specter organization ID: the most recent reported revenue figure (with its date and metric) and the ML-estimated revenue with its growth trend.
Report `latest_revenue_reported_usd` (with date and `revenue_type`) as the reported figure and `est_revenue_usd` as the Specter estimate. Format money compactly (e.g. $120M). Growth percentages: 4.05 means +4.05% (can be negative). Omit null fields.
The description explains the capability, when to use it, and what to expect.
Inputs50/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
external_company_id
Specter external ID for the company.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Get a company's latest valuation by Specter organization ID: the most recent reported post-money valuation (with its date) and the ML-estimated valuation with its growth trend.
Report `latest_valuation_reported_usd` (with date) as the reported figure and `est_valuation_usd` as the Specter estimate. Format money compactly (e.g. $1.2B). Growth percentages: 4.05 means +4.05% (can be negative). Omit null fields.
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.
external_company_id
Specter external ID for the company.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Find ONE SPECIFIC person you can already name — by external ID, LinkedIn URL, email, or exact name — and return a minimal profile. This is a quick LOOKUP of a known entity, not a search: for any descriptive query ('CTOs in Munich', 'people who left McKinsey') use `search` / `create_saved_search` instead.
Render: hyperlink `name` to `https://app.tryspecter.com/people/all/{external_person_id}/about`. Show `linkedin_url` as a clickable link. Omit null fields.
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.
identifier
Person identifier: Specter person ID, LinkedIn URL, email, or full name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Get a detailed person profile by external person ID, including role history and education.
First-time presentation:
{full_name} · LinkedIn {tagline} · Current: {current_position.title} at {current_position.company_name}
Then: career timeline (most recent first) → education → highlights (plain English).
Hyperlink `name` to `https://app.tryspecter.com/people/all/{external_person_id}/about`. Show `linkedin_url` as clickable link. Surface `top_university` from education when true. Highlight: domain expertise, founder-market fit, prior exits, track record, years of experience.
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.
external_person_id
Specter person ID (per_...).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description76/100
Get a personal or professional email address for a person by external person ID.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
external_person_id
Specter person ID (per_...).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
email_type
The type of email to get, applied as a filter: personal and professional return only an address of that kind and error when none is on file. Use either to prefer professional and fall back to personal.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"type": "object",
"required": [
"email",
"email_type"
],
"properties": {
"email": {
"type": "string",
"description": "Email address for the person."
},
"email_type": {
"enum": [
"personal",
"professional",
"either"
],
"type": "string",
"description": "Whether the returned email is personal or professional."
}
}
}
Original tool metadata
{
"name": "get_person_email",
"title": "Get Person Email",
"description": "Get a personal or professional email address for a person by external person ID.",
"inputSchema": {
"type": "object",
"required": [
"external_person_id"
],
"properties": {
"email_type": {
"enum": [
"personal",
"professional",
"either"
],
"type": "string",
"default": "either",
"description": "The type of email to get, applied as a filter: personal and professional return only an address of that kind and error when none is on file. Use either to prefer professional and fall back to personal."
},
"external_person_id": {
"type": "string",
"pattern": "per_[a-f0-9]{24}",
"description": "Specter person ID (per_...)."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"email",
"email_type"
],
"properties": {
"email": {
"type": "string",
"description": "Email address for the person."
},
"email_type": {
"enum": [
"personal",
"professional",
"either"
],
"type": "string",
"description": "Whether the returned email is personal or professional."
}
}
},
"annotations": {
"title": "Get Person Email",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Get the talent signals for one person by Specter person ID: the career moves Specter tracked for them — founding a company, going stealth, coming out of stealth, executive hires, promotions. Supports date-range filtering (`date_from` / `date_to`, on the signal date) and pagination.
Render as a table: Date | Signal | From → To | Score. Scores are 1-10. Signals are ordered newest first. `new_position_company_external_id` is a Specter company ID — offer `get_company_profile` for it. Surface `out_of_stealth_advantage` when present as how many days early the move was caught. Append (Est.) to industries and tech verticals when `is_industry_estimated` is true. When `total` exceeds the number of returned signals, offer to fetch the next page. Omit null fields.
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.
external_person_id
Specter person ID (per_...).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
date_from
Only return signals dated on or after this date (YYYY-MM-DD, inclusive).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
date_to
Only return signals dated on or before this date (YYYY-MM-DD, inclusive).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
0-based page number.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Max signals per page (1-50).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Find an investor by Specter investor ID (inv_...), LinkedIn URL, domain, or name and return a minimal profile. Resolve to an ID here first, then call `get_investor_profile` / `get_investor_funding_rounds` / `get_investor_interest_signals` for detail. Prefer the investor's domain when you know it: many fund names are shared, and a bare name returns only the likeliest holder — read `match_verdict` before building on it.
Render as a compact line. Omit null fields.
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.
identifier
Investor identifier: Specter investor ID (inv_...), LinkedIn URL, domain (preferred over name), or name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Get a detailed investor profile by Specter investor ID: firmographics, investment activity (counts, stages, industries, tech verticals), and portfolio company IDs.
Render as a mini profile: name, type, HQ, founded, then activity (investments / lead / exits / funds) and focus (stages, industries, tech verticals). Show `linkedin_url` / `crunchbase_url` as links. When `company_id` or `person_id` is present the investor is itself an entity — offer `get_company_profile` / `get_person_profile`. Omit null fields.
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.
external_investor_id
Specter investor ID (inv_...).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Get funding rounds a given investor participated in by Specter investor ID, with the funded company and co-investors. Supports date-range filtering (`date_from` / `date_to`, on the announcement date) and pagination.
Render as a table: Date | Company | Round | Raised | Lead. Rounds are ordered newest first. When `total` exceeds the returned count, offer to fetch the next page. Omit null fields.
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.
external_investor_id
Specter investor ID (inv_...).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
date_from
Only return rounds announced on or after this date (YYYY-MM-DD, inclusive).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
date_to
Only return rounds announced on or before this date (YYYY-MM-DD, inclusive).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
0-based page number.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Max rounds per page (1-50).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Get investor-interest signals sourced from a given investor by Specter investor ID: the funding, growth, and market-activity signals attributed to that investor. Supports date-range filtering (`date_from` / `date_to`, on the signal date) and pagination.
Render as a table: Date | Entity | Score | Type | Summary. Scores are 1-10. Signals are ordered newest first. `entity_id` links the company / person the signal concerns — offer `get_company_profile` / `get_person_profile`. Omit null fields.
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.
external_investor_id
Specter investor ID (inv_...).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
date_from
Only return signals dated on or after this date (YYYY-MM-DD, inclusive).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
date_to
Only return signals dated on or before this date (YYYY-MM-DD, inclusive).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
0-based page number.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Max signals per page (1-50).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
List accessible lists for the current user. Supports optional name filtering and pagination.
Render as a concise table: list name, item count, list ID. Offer to pull items via `get_list_items`.
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.
product_type
The type of lists to retrieve.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
search
Optional case-insensitive substring filter on list name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
0-based page number.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Maximum number of lists to return (1-50).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"type": "object",
"required": [
"lists"
],
"properties": {
"lists": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name",
"type",
"item_count",
"is_shared_with_api"
],
"properties": {
"id": {
"type": "string",
"description": "The unique ID of the list."
},
"name": {
"type": "string",
"description": "The display name of the list."
},
"type": {
"type": "string",
"description": "The product type of the list (e.g. company)."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the list."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the list was created."
},
"item_count": {
"type": "integer",
"description": "Number of items currently in the list."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the list was last modified."
},
"is_shared_with_api": {
"type": "boolean",
"description": "Whether the list is shared with the API."
},
"count_new_growth_signals": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "New growth signals this week for companies in this list. Only present for DB-backed lists."
},
"count_new_funding_signals": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "New funding signals this week for companies in this list. Only present for DB-backed lists."
}
}
},
{
"type": "object",
"required": [
"id",
"name",
"type",
"item_count",
"is_shared_with_api"
],
"properties": {
"id": {
"type": "string",
"description": "The unique ID of the list."
},
"name": {
"type": "string",
"description": "The display name of the list."
},
"type": {
"type": "string",
"description": "The product type of the list (e.g. company)."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the list."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the list was created."
},
"item_count": {
"type": "integer",
"description": "Number of items currently in the list."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the list was last modified."
},
"is_shared_with_api": {
"type": "boolean",
"description": "Whether the list is shared with the API."
},
"count_new_talent_signals": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "New talent signals this week for people in this list. Only present for DB-backed lists."
},
"count_new_interest_signals": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "New interest signals this week for people in this list. Only present for DB-backed lists."
}
}
},
{
"type": "object",
"required": [
"id",
"name",
"type",
"item_count",
"is_shared_with_api"
],
"properties": {
"id": {
"type": "string",
"description": "The unique ID of the list."
},
"name": {
"type": "string",
"description": "The display name of the list."
},
"type": {
"type": "string",
"description": "The product type of the list (e.g. company)."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the list."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the list was created."
},
"item_count": {
"type": "integer",
"description": "Number of items currently in the list."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the list was last modified."
},
"is_shared_with_api": {
"type": "boolean",
"description": "Whether the list is shared with the API."
},
"count_new_investments": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "New funding rounds this week for investors in this list. Only present for DB-backed lists."
},
"count_new_acquisitions": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "New acquisitions this week by investors in this list. Only present for DB-backed lists."
},
"count_new_interest_signals": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "New interest signals this week from investors in this list. Only present for DB-backed lists."
}
}
}
]
}
}
}
}
Original tool metadata
{
"name": "get_lists",
"title": "Get Lists",
"description": "List accessible lists for the current user. Supports optional name filtering and pagination.\n\nRender as a concise table: list name, item count, list ID. Offer to pull items via `get_list_items`.",
"inputSchema": {
"type": "object",
"required": [
"product_type"
],
"properties": {
"page": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "0-based page number."
},
"limit": {
"type": "integer",
"default": 50,
"maximum": 50,
"minimum": 1,
"description": "Maximum number of lists to return (1-50)."
},
"search": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional case-insensitive substring filter on list name."
},
"product_type": {
"enum": [
"company",
"people",
"investors"
],
"type": "string",
"description": "The type of lists to retrieve."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"lists"
],
"properties": {
"lists": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name",
"type",
"item_count",
"is_shared_with_api"
],
"properties": {
"id": {
"type": "string",
"description": "The unique ID of the list."
},
"name": {
"type": "string",
"description": "The display name of the list."
},
"type": {
"type": "string",
"description": "The product type of the list (e.g. company)."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the list."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the list was created."
},
"item_count": {
"type": "integer",
"description": "Number of items currently in the list."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the list was last modified."
},
"is_shared_with_api": {
"type": "boolean",
"description": "Whether the list is shared with the API."
},
"count_new_growth_signals": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "New growth signals this week for companies in this list. Only present for DB-backed lists."
},
"count_new_funding_signals": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "New funding signals this week for companies in this list. Only present for DB-backed lists."
}
}
},
{
"type": "object",
"required": [
"id",
"name",
"type",
"item_count",
"is_shared_with_api"
],
"properties": {
"id": {
"type": "string",
"description": "The unique ID of the list."
},
"name": {
"type": "string",
"description": "The display name of the list."
},
"type": {
"type": "string",
"description": "The product type of the list (e.g. company)."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the list."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the list was created."
},
"item_count": {
"type": "integer",
"description": "Number of items currently in the list."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the list was last modified."
},
"is_shared_with_api": {
"type": "boolean",
"description": "Whether the list is shared with the API."
},
"count_new_talent_signals": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "New talent signals this week for people in this list. Only present for DB-backed lists."
},
"count_new_interest_signals": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "New interest signals this week for people in this list. Only present for DB-backed lists."
}
}
},
{
"type": "object",
"required": [
"id",
"name",
"type",
"item_count",
"is_shared_with_api"
],
"properties": {
"id": {
"type": "string",
"description": "The unique ID of the list."
},
"name": {
"type": "string",
"description": "The display name of the list."
},
"type": {
"type": "string",
"description": "The product type of the list (e.g. company)."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the list."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the list was created."
},
"item_count": {
"type": "integer",
"description": "Number of items currently in the list."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the list was last modified."
},
"is_shared_with_api": {
"type": "boolean",
"description": "Whether the list is shared with the API."
},
"count_new_investments": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "New funding rounds this week for investors in this list. Only present for DB-backed lists."
},
"count_new_acquisitions": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "New acquisitions this week by investors in this list. Only present for DB-backed lists."
},
"count_new_interest_signals": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "New interest signals this week from investors in this list. Only present for DB-backed lists."
}
}
}
]
}
}
}
},
"annotations": {
"title": "Get Lists",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Get items in a specific list by list ID. Use `get_lists` first to resolve a list name to an ID.
Show list name, item count, and list ID at the top. Render items as a concise table: name (hyperlinked), social links, key metric (stage, funding, employees). Hyperlink companies to `https://app.tryspecter.com/companies/all/{external_company_id}/overview` and people to `https://app.tryspecter.com/people/all/{external_person_id}/about`. Offer to pull full details on any result. For company items, render `industry` and `tech_verticals` with ` > ` separator when present. Investor items: render name, type, HQ, #investments and #exits; investors are not hyperlinked.
The description explains the capability, when to use it, and what to expect.
Inputs80/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
list_id
The ID of the list to fetch. Use a UUID for regular lists or a built-in name for Specter lists. Company built-ins: MY_NETWORK, MY_CRM, LIKED, DISLIKED. People built-ins: MY_NETWORK, LIKED, DISLIKED. Investor built-ins: LIKED, DISLIKED.
Clear enough to supply this argument.
product_type
The type of list to fetch.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Max items per page (1-50).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Number of items to skip.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
signal_mode
Controls which subset of items to return. Valid values per product type:
- 'company': 'all' | 'new_funding_signals' | 'new_growth_signals'
- 'people': 'all' | 'new_talent_signals' | 'new_interest_signals'
- 'investors': 'all' (investor lists expose signal counts via `get_lists` but no member-level signal filtering)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
The reverse of `get_list_items`: for a batch of records, which Specter lists they are in and what the team's connected CRM holds on them (CRM lists and per-entry status, record owner, lifecycle stage, linked deals, last/next activity).
Reach for it whenever the answer depends on what the team already has on a record rather than on what Specter knows about it — annotating a search page or list with the CRM list each record sits in, briefing on several CRM lists at once, or telling saved records apart from new ones. Pass the external ids another tool returned, matching `product_type`.
Every requested id comes back, in the order asked: an empty `specter_lists` means the record is in none the caller can access, and an empty `crm_records` means no connected CRM holds it. `crm_supported` is false for investors, talent and stratintel, whose `crm_records` are empty for want of a CRM counterpart rather than for want of a match — say so rather than reporting them as absent from the CRM.
CRM values are the team's own, mirrored at `synced_at` and shown as the CRM names them; render them verbatim. Only the pulled fields listed above exist — a CRM's custom properties are not mirrored, so never imply a record has none of something this tool cannot see. Render as one row per record, naming the Specter lists and, per CRM, the lists with their status.
The description explains the capability, when to use it, and what to expect.
Inputs63/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
entity_ids
External ids to look up, matching `product_type`: company → `external_company_id`, people → `external_person_id` (per_...), investors → investor id, talent → talent id, stratintel → strategic id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
product_type
The product the ids belong to.
Explain the meaning of this value, not just its name.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"required": [
"product",
"crm_supported",
"memberships"
],
"properties": {
"product": {
"type": "string",
"description": "The product the ids belong to."
},
"memberships": {
"type": "array",
"items": {
"type": "object",
"required": [
"entity_id"
],
"properties": {
"entity_id": {
"type": "string",
"description": "The external Specter id that was asked about."
},
"crm_records": {
"type": "array",
"items": {
"type": "object",
"required": [
"crm"
],
"properties": {
"crm": {
"type": "string",
"description": "Integration key, e.g. 'attio', 'hubspot', 'salesforce'."
},
"deals": {
"type": "array",
"items": {
"type": "object",
"required": [
"stage"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Deal name."
},
"owner": {
"anyOf": [
{
"type": "object",
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Owner's name in the CRM."
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Owner's email in the CRM."
}
}
},
{
"type": "null"
}
],
"default": null,
"description": "Deal owner."
},
"stage": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Deal stage, as the CRM names it. Absent where the CRM identifies the stage only by an opaque id."
},
"amount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Deal amount."
},
"added_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "When the deal entered the pipeline."
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Deal currency code."
},
"pipeline_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The pipeline the deal sits in."
},
"last_activity_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "Last activity on the deal."
}
}
},
"description": "Deals linked to the record."
},
"lists": {
"type": "array",
"items": {
"type": "object",
"required": [
"remote_id"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "CRM list/segment name, when the list index has it."
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The record's per-entry status in this list, where the CRM has one (e.g. an Attio list stage)."
},
"remote_id": {
"type": "string",
"description": "The list's id in the CRM."
}
}
},
"description": "CRM lists/segments the record is in."
},
"owner": {
"anyOf": [
{
"type": "object",
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Owner's name in the CRM."
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Owner's email in the CRM."
}
}
},
{
"type": "null"
}
],
"default": null,
"description": "Record owner in the CRM."
},
"synced_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "When Specter last pulled this record from the CRM."
},
"last_email_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "Most recent email."
},
"last_meeting_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "Most recent meeting."
},
"lifecycle_stage": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Lifecycle stage, as the CRM names it."
},
"next_meeting_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "Next scheduled meeting."
},
"last_activity_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "Most recent interaction of any kind."
}
},
"description": "One CRM's view of the record; one per integration holding it."
},
"description": "What each connected CRM holds on the record. Empty means no connected CRM has it — or that no CRM is connected."
},
"specter_lists": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string",
"description": "List id, usable with `get_list_items`."
},
"name": {
"type": "string",
"description": "List name."
}
}
},
"description": "Specter lists the record is in that the caller can access. Empty means it is in none of them."
}
}
},
"description": "One entry per requested id, in the order asked, including ids that turned out to be in nothing."
},
"crm_supported": {
"type": "boolean",
"description": "Whether this product has CRM data at all. False for talent, stratintel and investors, whose `crm_records` are always empty for that reason rather than for want of a match."
}
}
}
Original tool metadata
{
"name": "get_entity_memberships",
"title": "Get Entity Memberships",
"description": "The reverse of `get_list_items`: for a batch of records, which Specter lists they are in and what the team's connected CRM holds on them (CRM lists and per-entry status, record owner, lifecycle stage, linked deals, last/next activity).\n\nReach for it whenever the answer depends on what the team already has on a record rather than on what Specter knows about it — annotating a search page or list with the CRM list each record sits in, briefing on several CRM lists at once, or telling saved records apart from new ones. Pass the external ids another tool returned, matching `product_type`.\n\nEvery requested id comes back, in the order asked: an empty `specter_lists` means the record is in none the caller can access, and an empty `crm_records` means no connected CRM holds it. `crm_supported` is false for investors, talent and stratintel, whose `crm_records` are empty for want of a CRM counterpart rather than for want of a match — say so rather than reporting them as absent from the CRM.\n\nCRM values are the team's own, mirrored at `synced_at` and shown as the CRM names them; render them verbatim. Only the pulled fields listed above exist — a CRM's custom properties are not mirrored, so never imply a record has none of something this tool cannot see. Render as one row per record, naming the Specter lists and, per CRM, the lists with their status.",
"inputSchema": {
"type": "object",
"required": [
"entity_ids",
"product_type"
],
"properties": {
"entity_ids": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 100,
"minItems": 1,
"description": "External ids to look up, matching `product_type`: company → `external_company_id`, people → `external_person_id` (per_...), investors → investor id, talent → talent id, stratintel → strategic id."
},
"product_type": {
"enum": [
"company",
"people",
"investors",
"talent",
"stratintel"
],
"type": "string",
"description": "The product the ids belong to."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"product",
"crm_supported",
"memberships"
],
"properties": {
"product": {
"type": "string",
"description": "The product the ids belong to."
},
"memberships": {
"type": "array",
"items": {
"type": "object",
"required": [
"entity_id"
],
"properties": {
"entity_id": {
"type": "string",
"description": "The external Specter id that was asked about."
},
"crm_records": {
"type": "array",
"items": {
"type": "object",
"required": [
"crm"
],
"properties": {
"crm": {
"type": "string",
"description": "Integration key, e.g. 'attio', 'hubspot', 'salesforce'."
},
"deals": {
"type": "array",
"items": {
"type": "object",
"required": [
"stage"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Deal name."
},
"owner": {
"anyOf": [
{
"type": "object",
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Owner's name in the CRM."
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Owner's email in the CRM."
}
}
},
{
"type": "null"
}
],
"default": null,
"description": "Deal owner."
},
"stage": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Deal stage, as the CRM names it. Absent where the CRM identifies the stage only by an opaque id."
},
"amount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Deal amount."
},
"added_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "When the deal entered the pipeline."
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Deal currency code."
},
"pipeline_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The pipeline the deal sits in."
},
"last_activity_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "Last activity on the deal."
}
}
},
"description": "Deals linked to the record."
},
"lists": {
"type": "array",
"items": {
"type": "object",
"required": [
"remote_id"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "CRM list/segment name, when the list index has it."
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The record's per-entry status in this list, where the CRM has one (e.g. an Attio list stage)."
},
"remote_id": {
"type": "string",
"description": "The list's id in the CRM."
}
}
},
"description": "CRM lists/segments the record is in."
},
"owner": {
"anyOf": [
{
"type": "object",
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Owner's name in the CRM."
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Owner's email in the CRM."
}
}
},
{
"type": "null"
}
],
"default": null,
"description": "Record owner in the CRM."
},
"synced_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "When Specter last pulled this record from the CRM."
},
"last_email_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "Most recent email."
},
"last_meeting_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "Most recent meeting."
},
"lifecycle_stage": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Lifecycle stage, as the CRM names it."
},
"next_meeting_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "Next scheduled meeting."
},
"last_activity_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "Most recent interaction of any kind."
}
},
"description": "One CRM's view of the record; one per integration holding it."
},
"description": "What each connected CRM holds on the record. Empty means no connected CRM has it — or that no CRM is connected."
},
"specter_lists": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string",
"description": "List id, usable with `get_list_items`."
},
"name": {
"type": "string",
"description": "List name."
}
}
},
"description": "Specter lists the record is in that the caller can access. Empty means it is in none of them."
}
}
},
"description": "One entry per requested id, in the order asked, including ids that turned out to be in nothing."
},
"crm_supported": {
"type": "boolean",
"description": "Whether this product has CRM data at all. False for talent, stratintel and investors, whose `crm_records` are always empty for that reason rather than for want of a match."
}
}
},
"annotations": {
"title": "Get Entity Memberships",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Create a new Specter list owned by the current user and shared with the API. Optionally seed it with items.
`item_ids` are the external ids returned by other tools, matching `product_type`: company → `external_company_id`, people → `external_person_id` (per_...), investors → investor id, talent → talent id, stratintel → strategic id. Duplicate ids are ignored, but an id that is malformed for `product_type` or names no entity Specter knows fails the whole call and no list is created — resolve ids with a find/search tool first.
Calling this twice with the same name is safe: you already own a list of this product and name, it is returned and any items it does not yet hold are added, so one list results. `item_count` reports what this call added.
Note: only `company` and `people` lists can be read back via `get_lists`/`get_list_items`; the other product types are still created successfully and are accessible via the Specter API.
The description explains the capability, when to use it, and what to expect.
Inputs67/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Display name for the new list.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
product_type
The product type of items the list will hold.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
item_ids
Optional external ids to seed the list with, matching `product_type`.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
{
"type": "object",
"required": [
"list_id",
"name",
"product_type",
"item_count"
],
"properties": {
"name": {
"type": "string",
"description": "The display name of the list."
},
"list_id": {
"type": "string",
"description": "The ID of the newly created list."
},
"item_count": {
"type": "integer",
"description": "Number of items seeded into the new list."
},
"product_type": {
"type": "string",
"description": "The product type of the list (e.g. company)."
}
}
}
Original tool metadata
{
"name": "create_list",
"title": "Create List",
"description": "Create a new Specter list owned by the current user and shared with the API. Optionally seed it with items.\n\n`item_ids` are the external ids returned by other tools, matching `product_type`: company → `external_company_id`, people → `external_person_id` (per_...), investors → investor id, talent → talent id, stratintel → strategic id. Duplicate ids are ignored, but an id that is malformed for `product_type` or names no entity Specter knows fails the whole call and no list is created — resolve ids with a find/search tool first.\n\nCalling this twice with the same name is safe: you already own a list of this product and name, it is returned and any items it does not yet hold are added, so one list results. `item_count` reports what this call added.\n\nNote: only `company` and `people` lists can be read back via `get_lists`/`get_list_items`; the other product types are still created successfully and are accessible via the Specter API.",
"inputSchema": {
"type": "object",
"required": [
"name",
"product_type"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Display name for the new list."
},
"item_ids": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
{
"type": "null"
}
],
"default": null,
"description": "Optional external ids to seed the list with, matching `product_type`."
},
"product_type": {
"enum": [
"company",
"people",
"investors",
"talent",
"stratintel"
],
"type": "string",
"description": "The product type of items the list will hold."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"list_id",
"name",
"product_type",
"item_count"
],
"properties": {
"name": {
"type": "string",
"description": "The display name of the list."
},
"list_id": {
"type": "string",
"description": "The ID of the newly created list."
},
"item_count": {
"type": "integer",
"description": "Number of items seeded into the new list."
},
"product_type": {
"type": "string",
"description": "The product type of the list (e.g. company)."
}
}
},
"annotations": {
"title": "Create List",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
Update a list: rename it, change whether it is shared with the API, and/or change its membership. Works for any list product (the product is resolved from the list ID, so item ids must match that product). Use `get_lists` to resolve a list name to its ID and `get_list_items` to see what is in it.
Membership can be changed on any list you can access; renaming and `is_shared_with_api` are limited to lists you own or administer.
Pass at least one of `name` / `is_shared_with_api` / `add_item_ids` / `remove_item_ids`. Item ids are the external ids returned by other tools: company → `external_company_id`, people → `external_person_id` (per_...), investors → investor id, talent → talent id, stratintel → strategic id.
Membership changes are idempotent and reported per direction: items already in the list count towards `already_present`, requested removals that were not members towards `not_present` — neither is an error. Removals are applied after additions.
An id that is malformed for the list's product, or that names no entity Specter knows, fails the whole call and nothing is written — resolve ids with a find/search tool first. Fails too if you already own another list of the same product with the requested name.
The description explains the capability, when to use it, and what to expect.
Inputs80/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
list_id
UUID of the list to update.
Clear enough to supply this argument.
name
New display name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
is_shared_with_api
Whether to share the list with the API.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
add_item_ids
External ids to add to the list, matching the list's product. Ids already in the list are skipped.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
remove_item_ids
External ids to remove from the list, matching the list's product. Ids that are not members are skipped.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"list_id"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The new list name if it was renamed, else null (unchanged)."
},
"added": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Number of items newly added to the list, or null when no items were requested for addition."
},
"list_id": {
"type": "string",
"description": "The ID of the updated list."
},
"removed": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Number of items removed from the list, or null when no items were requested for removal."
},
"not_present": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Number of requested removals that were not in the list (skipped, not an error), or null when none were requested."
},
"already_present": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Number of requested additions that were already in the list (skipped, not re-added), or null when none were requested."
},
"is_shared_with_api": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "The new API-sharing flag if it was changed, else null (unchanged)."
}
}
}
Original tool metadata
{
"name": "update_list",
"title": "Update List",
"description": "Update a list: rename it, change whether it is shared with the API, and/or change its membership. Works for any list product (the product is resolved from the list ID, so item ids must match that product). Use `get_lists` to resolve a list name to its ID and `get_list_items` to see what is in it.\n\nMembership can be changed on any list you can access; renaming and `is_shared_with_api` are limited to lists you own or administer.\n\nPass at least one of `name` / `is_shared_with_api` / `add_item_ids` / `remove_item_ids`. Item ids are the external ids returned by other tools: company → `external_company_id`, people → `external_person_id` (per_...), investors → investor id, talent → talent id, stratintel → strategic id.\n\nMembership changes are idempotent and reported per direction: items already in the list count towards `already_present`, requested removals that were not members towards `not_present` — neither is an error. Removals are applied after additions.\n\nAn id that is malformed for the list's product, or that names no entity Specter knows, fails the whole call and nothing is written — resolve ids with a find/search tool first. Fails too if you already own another list of the same product with the requested name.",
"inputSchema": {
"type": "object",
"required": [
"list_id"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
],
"default": null,
"description": "New display name."
},
"list_id": {
"type": "string",
"description": "UUID of the list to update."
},
"add_item_ids": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
{
"type": "null"
}
],
"default": null,
"description": "External ids to add to the list, matching the list's product. Ids already in the list are skipped."
},
"remove_item_ids": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
{
"type": "null"
}
],
"default": null,
"description": "External ids to remove from the list, matching the list's product. Ids that are not members are skipped."
},
"is_shared_with_api": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "Whether to share the list with the API."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"list_id"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The new list name if it was renamed, else null (unchanged)."
},
"added": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Number of items newly added to the list, or null when no items were requested for addition."
},
"list_id": {
"type": "string",
"description": "The ID of the updated list."
},
"removed": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Number of items removed from the list, or null when no items were requested for removal."
},
"not_present": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Number of requested removals that were not in the list (skipped, not an error), or null when none were requested."
},
"already_present": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Number of requested additions that were already in the list (skipped, not re-added), or null when none were requested."
},
"is_shared_with_api": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "The new API-sharing flag if it was changed, else null (unchanged)."
}
}
},
"annotations": {
"title": "Update List",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Delete (archive) a list you can manage. Works for any list product (the product is resolved from the list ID). Use `get_lists` to resolve a list name to its ID. The list is soft-deleted and stops appearing in `get_lists`.
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.
{
"type": "object",
"required": [
"list_id",
"deleted"
],
"properties": {
"deleted": {
"type": "boolean",
"description": "Whether the list was archived (soft-deleted)."
},
"list_id": {
"type": "string",
"description": "The ID of the deleted list."
}
}
}
Original tool metadata
{
"name": "delete_list",
"title": "Delete List",
"description": "Delete (archive) a list you can manage. Works for any list product (the product is resolved from the list ID). Use `get_lists` to resolve a list name to its ID. The list is soft-deleted and stops appearing in `get_lists`.",
"inputSchema": {
"type": "object",
"required": [
"list_id"
],
"properties": {
"list_id": {
"type": "string",
"description": "UUID of the list to delete."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"list_id",
"deleted"
],
"properties": {
"deleted": {
"type": "boolean",
"description": "Whether the list was archived (soft-deleted)."
},
"list_id": {
"type": "string",
"description": "The ID of the deleted list."
}
}
},
"annotations": {
"title": "Delete List",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
List saved searches accessible to the current user, for any product: company, people, talent signals, investor interest signals, investors (firms), and the transaction feeds — funding rounds, acquisitions and IPOs. Supports optional name filtering and pagination.
Render as a concise table: search name, item count, search ID. The count fields are named per product (e.g. `full_companies_count`, `full_funding_rounds_count`, `full_acquisitions_count`, `full_ipos_count`). Offer to pull results via `get_saved_search_items`.
`last_viewed_at` is when the current user last opened each search. For "what is new since I last checked", do not read it and do not ask for a date — call `get_saved_search_items` with `since_last_viewed=true`, which resolves the same stored moment itself.
To link a search, open its product feed with BOTH `queryId=<query_id>` and `searchId=<search_id>`.
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.
product_type
The type of saved searches to list.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
search
Optional case-insensitive substring filter on search name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
0-based page number.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Maximum number of searches to return (1-50).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"type": "object",
"required": [
"searches"
],
"properties": {
"searches": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"search_id",
"name",
"query_id",
"new_companies_count",
"full_companies_count"
],
"properties": {
"name": {
"type": "string",
"description": "The name of the search."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the search."
},
"query_id": {
"type": "integer",
"description": "The query ID associated with the search."
},
"search_id": {
"type": "integer",
"description": "The ID of the search."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was created."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was last modified."
},
"last_viewed_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the CURRENT USER last opened this search in the app; null when they never have. This is the stored cutoff behind \"what is new since I last checked\" — to answer that, call `get_saved_search_items` with `since_last_viewed=true` rather than passing this value back or asking the user for a date."
},
"new_companies_count": {
"type": "integer",
"description": "Companies added to the search in the last 30 days; -1 when the count is not available yet."
},
"full_companies_count": {
"type": "integer",
"description": "The total number of companies in the search."
}
}
},
{
"type": "object",
"required": [
"search_id",
"name",
"query_id",
"new_talent_signals_count",
"full_people_count"
],
"properties": {
"name": {
"type": "string",
"description": "The name of the search."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the search."
},
"query_id": {
"type": "integer",
"description": "The query ID associated with the search."
},
"search_id": {
"type": "integer",
"description": "The ID of the search."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was created."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was last modified."
},
"last_viewed_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the CURRENT USER last opened this search in the app; null when they never have. This is the stored cutoff behind \"what is new since I last checked\" — to answer that, call `get_saved_search_items` with `since_last_viewed=true` rather than passing this value back or asking the user for a date."
},
"full_people_count": {
"type": "integer",
"description": "The total number of people in the search."
},
"new_talent_signals_count": {
"type": "integer",
"description": "People added to the search in the last 30 days; -1 when the count is not available yet."
}
}
},
{
"type": "object",
"required": [
"search_id",
"name",
"query_id",
"new_signals_count",
"full_signals_count"
],
"properties": {
"name": {
"type": "string",
"description": "The name of the search."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the search."
},
"query_id": {
"type": "integer",
"description": "The query ID associated with the search."
},
"search_id": {
"type": "integer",
"description": "The ID of the search."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was created."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was last modified."
},
"last_viewed_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the CURRENT USER last opened this search in the app; null when they never have. This is the stored cutoff behind \"what is new since I last checked\" — to answer that, call `get_saved_search_items` with `since_last_viewed=true` rather than passing this value back or asking the user for a date."
},
"new_signals_count": {
"type": "integer",
"description": "Talent signals added to the search in the last 30 days; -1 when the count is not available yet."
},
"full_signals_count": {
"type": "integer",
"description": "The total number of talent signals in the search."
}
}
},
{
"type": "object",
"required": [
"search_id",
"name",
"query_id",
"new_signals_count",
"full_signals_count"
],
"properties": {
"name": {
"type": "string",
"description": "The name of the search."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the search."
},
"query_id": {
"type": "integer",
"description": "The query ID associated with the search."
},
"search_id": {
"type": "integer",
"description": "The ID of the search."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was created."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was last modified."
},
"last_viewed_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the CURRENT USER last opened this search in the app; null when they never have. This is the stored cutoff behind \"what is new since I last checked\" — to answer that, call `get_saved_search_items` with `since_last_viewed=true` rather than passing this value back or asking the user for a date."
},
"new_signals_count": {
"type": "integer",
"description": "Interest signals added to the search in the last 30 days; -1 when the count is not available yet."
},
"full_signals_count": {
"type": "integer",
"description": "The total number of interest signals in the search."
}
}
},
{
"type": "object",
"required": [
"search_id",
"name",
"query_id",
"new_investors_count",
"full_investors_count"
],
"properties": {
"name": {
"type": "string",
"description": "The name of the search."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the search."
},
"query_id": {
"type": "integer",
"description": "The query ID associated with the search."
},
"search_id": {
"type": "integer",
"description": "The ID of the search."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was created."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was last modified."
},
"last_viewed_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the CURRENT USER last opened this search in the app; null when they never have. This is the stored cutoff behind \"what is new since I last checked\" — to answer that, call `get_saved_search_items` with `since_last_viewed=true` rather than passing this value back or asking the user for a date."
},
"new_investors_count": {
"type": "integer",
"description": "Investors added to the search in the last 30 days; -1 when the count is not available yet."
},
"full_investors_count": {
"type": "integer",
"description": "The total number of investors in the search."
}
}
},
{
"type": "object",
"required": [
"search_id",
"name",
"query_id",
"new_funding_rounds_count",
"full_funding_rounds_count"
],
"properties": {
"name": {
"type": "string",
"description": "The name of the search."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the search."
},
"query_id": {
"type": "integer",
"description": "The query ID associated with the search."
},
"search_id": {
"type": "integer",
"description": "The ID of the search."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was created."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was last modified."
},
"last_viewed_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the CURRENT USER last opened this search in the app; null when they never have. This is the stored cutoff behind \"what is new since I last checked\" — to answer that, call `get_saved_search_items` with `since_last_viewed=true` rather than passing this value back or asking the user for a date."
},
"new_funding_rounds_count": {
"type": "integer",
"description": "Funding rounds added to the search in the last 30 days; -1 when the count is not available yet."
},
"full_funding_rounds_count": {
"type": "integer",
"description": "The total number of funding rounds in the search."
}
}
},
{
"type": "object",
"required": [
"search_id",
"name",
"query_id",
"new_acquisitions_count",
"full_acquisitions_count"
],
"properties": {
"name": {
"type": "string",
"description": "The name of the search."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the search."
},
"query_id": {
"type": "integer",
"description": "The query ID associated with the search."
},
"search_id": {
"type": "integer",
"description": "The ID of the search."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was created."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was last modified."
},
"last_viewed_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the CURRENT USER last opened this search in the app; null when they never have. This is the stored cutoff behind \"what is new since I last checked\" — to answer that, call `get_saved_search_items` with `since_last_viewed=true` rather than passing this value back or asking the user for a date."
},
"new_acquisitions_count": {
"type": "integer",
"description": "Acquisitions added to the search in the last 30 days; -1 when the count is not available yet."
},
"full_acquisitions_count": {
"type": "integer",
"description": "The total number of acquisitions in the search."
}
}
},
{
"type": "object",
"required": [
"search_id",
"name",
"query_id",
"new_ipos_count",
"full_ipos_count"
],
"properties": {
"name": {
"type": "string",
"description": "The name of the search."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the search."
},
"query_id": {
"type": "integer",
"description": "The query ID associated with the search."
},
"search_id": {
"type": "integer",
"description": "The ID of the search."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was created."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was last modified."
},
"last_viewed_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the CURRENT USER last opened this search in the app; null when they never have. This is the stored cutoff behind \"what is new since I last checked\" — to answer that, call `get_saved_search_items` with `since_last_viewed=true` rather than passing this value back or asking the user for a date."
},
"new_ipos_count": {
"type": "integer",
"description": "IPOs added to the search in the last 30 days; -1 when the count is not available yet."
},
"full_ipos_count": {
"type": "integer",
"description": "The total number of IPOs in the search."
}
}
}
]
}
}
}
}
Original tool metadata
{
"name": "get_saved_searches",
"title": "Get Saved Searches",
"description": "List saved searches accessible to the current user, for any product: company, people, talent signals, investor interest signals, investors (firms), and the transaction feeds — funding rounds, acquisitions and IPOs. Supports optional name filtering and pagination.\n\nRender as a concise table: search name, item count, search ID. The count fields are named per product (e.g. `full_companies_count`, `full_funding_rounds_count`, `full_acquisitions_count`, `full_ipos_count`). Offer to pull results via `get_saved_search_items`.\n\n`last_viewed_at` is when the current user last opened each search. For \"what is new since I last checked\", do not read it and do not ask for a date — call `get_saved_search_items` with `since_last_viewed=true`, which resolves the same stored moment itself.\n\nTo link a search, open its product feed with BOTH `queryId=<query_id>` and `searchId=<search_id>`.",
"inputSchema": {
"type": "object",
"required": [
"product_type"
],
"properties": {
"page": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "0-based page number."
},
"limit": {
"type": "integer",
"default": 50,
"maximum": 50,
"minimum": 1,
"description": "Maximum number of searches to return (1-50)."
},
"search": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional case-insensitive substring filter on search name."
},
"product_type": {
"enum": [
"company",
"people",
"talent_signals",
"interest_signals",
"investors",
"funding_rounds",
"acquisitions",
"ipos"
],
"type": "string",
"description": "The type of saved searches to list."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"searches"
],
"properties": {
"searches": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"search_id",
"name",
"query_id",
"new_companies_count",
"full_companies_count"
],
"properties": {
"name": {
"type": "string",
"description": "The name of the search."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the search."
},
"query_id": {
"type": "integer",
"description": "The query ID associated with the search."
},
"search_id": {
"type": "integer",
"description": "The ID of the search."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was created."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was last modified."
},
"last_viewed_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the CURRENT USER last opened this search in the app; null when they never have. This is the stored cutoff behind \"what is new since I last checked\" — to answer that, call `get_saved_search_items` with `since_last_viewed=true` rather than passing this value back or asking the user for a date."
},
"new_companies_count": {
"type": "integer",
"description": "Companies added to the search in the last 30 days; -1 when the count is not available yet."
},
"full_companies_count": {
"type": "integer",
"description": "The total number of companies in the search."
}
}
},
{
"type": "object",
"required": [
"search_id",
"name",
"query_id",
"new_talent_signals_count",
"full_people_count"
],
"properties": {
"name": {
"type": "string",
"description": "The name of the search."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the search."
},
"query_id": {
"type": "integer",
"description": "The query ID associated with the search."
},
"search_id": {
"type": "integer",
"description": "The ID of the search."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was created."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was last modified."
},
"last_viewed_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the CURRENT USER last opened this search in the app; null when they never have. This is the stored cutoff behind \"what is new since I last checked\" — to answer that, call `get_saved_search_items` with `since_last_viewed=true` rather than passing this value back or asking the user for a date."
},
"full_people_count": {
"type": "integer",
"description": "The total number of people in the search."
},
"new_talent_signals_count": {
"type": "integer",
"description": "People added to the search in the last 30 days; -1 when the count is not available yet."
}
}
},
{
"type": "object",
"required": [
"search_id",
"name",
"query_id",
"new_signals_count",
"full_signals_count"
],
"properties": {
"name": {
"type": "string",
"description": "The name of the search."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the search."
},
"query_id": {
"type": "integer",
"description": "The query ID associated with the search."
},
"search_id": {
"type": "integer",
"description": "The ID of the search."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was created."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was last modified."
},
"last_viewed_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the CURRENT USER last opened this search in the app; null when they never have. This is the stored cutoff behind \"what is new since I last checked\" — to answer that, call `get_saved_search_items` with `since_last_viewed=true` rather than passing this value back or asking the user for a date."
},
"new_signals_count": {
"type": "integer",
"description": "Talent signals added to the search in the last 30 days; -1 when the count is not available yet."
},
"full_signals_count": {
"type": "integer",
"description": "The total number of talent signals in the search."
}
}
},
{
"type": "object",
"required": [
"search_id",
"name",
"query_id",
"new_signals_count",
"full_signals_count"
],
"properties": {
"name": {
"type": "string",
"description": "The name of the search."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the search."
},
"query_id": {
"type": "integer",
"description": "The query ID associated with the search."
},
"search_id": {
"type": "integer",
"description": "The ID of the search."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was created."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was last modified."
},
"last_viewed_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the CURRENT USER last opened this search in the app; null when they never have. This is the stored cutoff behind \"what is new since I last checked\" — to answer that, call `get_saved_search_items` with `since_last_viewed=true` rather than passing this value back or asking the user for a date."
},
"new_signals_count": {
"type": "integer",
"description": "Interest signals added to the search in the last 30 days; -1 when the count is not available yet."
},
"full_signals_count": {
"type": "integer",
"description": "The total number of interest signals in the search."
}
}
},
{
"type": "object",
"required": [
"search_id",
"name",
"query_id",
"new_investors_count",
"full_investors_count"
],
"properties": {
"name": {
"type": "string",
"description": "The name of the search."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the search."
},
"query_id": {
"type": "integer",
"description": "The query ID associated with the search."
},
"search_id": {
"type": "integer",
"description": "The ID of the search."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was created."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was last modified."
},
"last_viewed_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the CURRENT USER last opened this search in the app; null when they never have. This is the stored cutoff behind \"what is new since I last checked\" — to answer that, call `get_saved_search_items` with `since_last_viewed=true` rather than passing this value back or asking the user for a date."
},
"new_investors_count": {
"type": "integer",
"description": "Investors added to the search in the last 30 days; -1 when the count is not available yet."
},
"full_investors_count": {
"type": "integer",
"description": "The total number of investors in the search."
}
}
},
{
"type": "object",
"required": [
"search_id",
"name",
"query_id",
"new_funding_rounds_count",
"full_funding_rounds_count"
],
"properties": {
"name": {
"type": "string",
"description": "The name of the search."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the search."
},
"query_id": {
"type": "integer",
"description": "The query ID associated with the search."
},
"search_id": {
"type": "integer",
"description": "The ID of the search."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was created."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was last modified."
},
"last_viewed_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the CURRENT USER last opened this search in the app; null when they never have. This is the stored cutoff behind \"what is new since I last checked\" — to answer that, call `get_saved_search_items` with `since_last_viewed=true` rather than passing this value back or asking the user for a date."
},
"new_funding_rounds_count": {
"type": "integer",
"description": "Funding rounds added to the search in the last 30 days; -1 when the count is not available yet."
},
"full_funding_rounds_count": {
"type": "integer",
"description": "The total number of funding rounds in the search."
}
}
},
{
"type": "object",
"required": [
"search_id",
"name",
"query_id",
"new_acquisitions_count",
"full_acquisitions_count"
],
"properties": {
"name": {
"type": "string",
"description": "The name of the search."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the search."
},
"query_id": {
"type": "integer",
"description": "The query ID associated with the search."
},
"search_id": {
"type": "integer",
"description": "The ID of the search."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was created."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was last modified."
},
"last_viewed_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the CURRENT USER last opened this search in the app; null when they never have. This is the stored cutoff behind \"what is new since I last checked\" — to answer that, call `get_saved_search_items` with `since_last_viewed=true` rather than passing this value back or asking the user for a date."
},
"new_acquisitions_count": {
"type": "integer",
"description": "Acquisitions added to the search in the last 30 days; -1 when the count is not available yet."
},
"full_acquisitions_count": {
"type": "integer",
"description": "The total number of acquisitions in the search."
}
}
},
{
"type": "object",
"required": [
"search_id",
"name",
"query_id",
"new_ipos_count",
"full_ipos_count"
],
"properties": {
"name": {
"type": "string",
"description": "The name of the search."
},
"creator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Full name of the user who created the search."
},
"query_id": {
"type": "integer",
"description": "The query ID associated with the search."
},
"search_id": {
"type": "integer",
"description": "The ID of the search."
},
"created_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was created."
},
"updated_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the search was last modified."
},
"last_viewed_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO 8601 timestamp when the CURRENT USER last opened this search in the app; null when they never have. This is the stored cutoff behind \"what is new since I last checked\" — to answer that, call `get_saved_search_items` with `since_last_viewed=true` rather than passing this value back or asking the user for a date."
},
"new_ipos_count": {
"type": "integer",
"description": "IPOs added to the search in the last 30 days; -1 when the count is not available yet."
},
"full_ipos_count": {
"type": "integer",
"description": "The total number of IPOs in the search."
}
}
}
]
}
}
}
},
"annotations": {
"title": "Get Saved Searches",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
List results returned by a specific saved search ID. Use `get_saved_searches` first to resolve a search name to an ID.
The product is inferred from the saved search; you do not pass it. "What is new since I last checked?" is `since_last_viewed=true` — never ask for a date. For a people search, `signal_mode='new_talent_signals'` returns TalentSignalItem entries, not PeopleSearchItem.
Show search name, item count and search ID at the top. Render `industry` / `industries` and `tech_verticals` with a ` > ` separator, noting the industry is estimated when `is_industry_estimated` is true. Signal scores are 1-10.
Default — concise table: name (hyperlinked), social links, key metric. Hyperlink companies to `https://app.tryspecter.com/companies/all/{external_company_id}/overview`, people to `https://app.tryspecter.com/people/all/{external_person_id}/about`.
Talent signals (people movements): Date | Person | Title | Company | Score | Signal Type | Signal Summary | Industry | Tech Vertical. Always show `signal_summary` (background + why notable) as a brief narrative below the row; a stealth company explains an estimated industry. Offer `get_person_profile` / `get_person_email` for follow-up.
Investor interest signals: Date | Name | Score | Signal Type | Signal Summary | Industry | Tech Vertical.
Investors (firms, e.g. VC funds): Name | Type | HQ | #Investments | #Exits — not hyperlinked.
Funding rounds: Date | Company | Round | Raised (USD) | #Investors. Acquisitions: Date | Acquirer | Acquiree | Type | Price (USD), saying undisclosed rather than leaving a blank. IPOs: Date | Company | Exchange:Ticker (`stock_exchange_symbol`:`stock_symbol`) | Share Price (USD) | Raised (USD) | Valuation (USD). Hyperlink each company to `https://app.tryspecter.com/companies/all/{external_company_id}/overview` via `company_id`, or `acquirer_company_id` / `acquiree_company_id` for acquisitions.
The description explains the capability, when to use it, and what to expect.
Inputs79/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
search_id
The ID of the saved search to fetch results for.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
0-based page number.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Max items per page (1-50).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
new_results_after
Optional. Only return results added to this saved search on or after this moment (ISO 8601, e.g. 2026-07-10T00:00:00Z). Additions are tracked for the last 60 days; an older value is rejected. Not valid with `signal_mode='new_talent_signals'`, whose signals are not the entities tracked for a people search.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
since_last_viewed
Optional. Only return results added to this saved search since the CURRENT USER last opened it in the app — the answer to "what is new since I last checked". The cutoff is read from the stored view time; you neither pass it nor ask the user for a date. The response reports the cutoff it used in `applied_cutoff` / `cutoff_source`. Not valid alongside `new_results_after` (which sets the cutoff itself) or a `signal_mode` other than 'all' (which applies a window of its own).
Clear enough to supply this argument.
signal_mode
Optional. Selects which subset of results to return; the product is inferred from the saved search. Valid values per product:
- company search: 'all' | 'new' (new this month)
- talent-signals search: 'all' | 'new' (signals from this week)
- people search: 'all' | 'new_talent_signals' (returns TalentSignalItem entries — new talent signals for the people in this search)
- investor-interest-signals search: 'all' | 'new' (signals from this week)
- investors search (investor firms): 'all' only
- funding-rounds / acquisitions / IPOs search: 'all' only (transaction feeds are already ordered by deal date)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"required": [
"search_name",
"total_count",
"items"
],
"properties": {
"items": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"linkedin_url",
"id",
"name",
"domain"
],
"properties": {
"id": {
"type": "string",
"description": "External company ID."
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Company name."
},
"domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Primary domain."
},
"industry": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null,
"description": "Industry classification by economic activity (up to 3 levels)."
},
"ranked_by": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The growth window this page is ordered by, named with its unit — e.g. `Trustpilot reviews, 3-month growth (absolute change)`. Present only when `sort` ranked on a `growth_metrics.*` field; null for any other ordering. Use it as the column header when the ranking itself is the answer, and read the unit from it: the follower/download/visit families are a percentage change, the rating and review families an absolute one."
},
"highlights": {
"type": "array",
"items": {
"type": "string"
},
"description": "Monthly awarded tags for company growth patterns."
},
"web_visits": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Estimated website visits last month."
},
"founded_year": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Company founded year."
},
"growth_stage": {
"anyOf": [
{
"enum": [
"no_funding",
"bootstrapped",
"pre_launch",
"seed",
"early",
"growing",
"late",
"exit"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Company growth stage, as a raw enum value. Never render it as returned — always show the product's label for it: `no_funding` = Bootstrapped, `bootstrapped` = Bootstrapped, `pre_launch` = Pre-Launch, `seed` = Pre-seed / Seed, `early` = Early Stage, `growing` = Growth Stage, `late` = Late Stage, `exit` = Exit Stage."
},
"linkedin_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "LinkedIn URL."
},
"customer_focus": {
"anyOf": [
{
"enum": [
"b2b",
"b2b_b2c",
"b2c",
"b2c_b2b"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Customer focus. One of: 'b2b', 'b2c', 'b2b_b2c', 'b2c_b2b'."
},
"employee_count": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Number of employees."
},
"tech_verticals": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"vertical",
"sub_verticals"
],
"properties": {
"vertical": {
"type": "string",
"description": "Top-level tech vertical."
},
"sub_verticals": {
"type": "array",
"items": {
"type": "string"
},
"description": "Sub-verticals under this vertical."
}
}
}
},
{
"type": "null"
}
],
"default": null,
"description": "Tech-domain classifications grouped by vertical (up to 5 verticals, each with sub-verticals)."
},
"business_models": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null,
"description": "Business model tags (e.g., 'saas', 'marketplace', 'subscription')."
},
"ranked_by_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "This company's figure for the window `ranked_by` names, in that window's unit. Null when the company has no figure on file for it — not 0. Report it against `ranked_by`, never against a window's name you infer from the `sort` field yourself, and do not reconstruct the metric's value at the start of the window from it: that level is not a published figure."
},
"last_funding_date": {
"anyOf": [
{
"type": "string",
"format": "date"
},
{
"type": "null"
}
],
"default": null,
"description": "Company last funding date."
},
"short_description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "10-20 word company tagline (AI-generated)."
},
"last_funding_amount": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Company last funding amount (USD)."
},
"last_round_investors": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null,
"description": "Investor names from the most recent funding round."
},
"total_funding_amount": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Company total funding amount (USD)."
},
"web_visits_growth_3m_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Website-visit growth over the trailing 3 months, as a percentage change (`12.5` is +12.5%, `-8.0` a decline). Null when unavailable — not 0%. This is the figure behind `sort` field `growth_metrics.web_visits_3mo_ratio`. Report it as growth: the visit count at the start of the window is not a published figure, so do not reconstruct one from this and the current value."
},
"web_visits_growth_6m_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Website-visit growth over the trailing 6 months, as a percentage change (`12.5` is +12.5%, `-8.0` a decline). Null when unavailable — not 0%. This is the figure behind `sort` field `growth_metrics.web_visits_6mo_ratio`. Report it as growth: the visit count at the start of the window is not a published figure, so do not reconstruct one from this and the current value."
},
"web_visits_growth_12m_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Website-visit growth over the trailing 12 months, as a percentage change (`12.5` is +12.5%, `-8.0` a decline). Null when unavailable — not 0%. This is the figure behind `sort` field `growth_metrics.web_visits_12mo_ratio`. Report it as growth: the visit count at the start of the window is not a published figure, so do not reconstruct one from this and the current value."
},
"employee_count_growth_3m_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Headcount growth over the trailing 3 months, as a percentage change (`12.5` is +12.5%, `-8.0` a decline). Null when unavailable — not 0%. This is the figure behind `sort` field `growth_metrics.employee_count_3mo_ratio`. Report it as growth: the headcount at the start of the window is not a published figure, so do not reconstruct one from this and the current value."
},
"employee_count_growth_6m_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Headcount growth over the trailing 6 months, as a percentage change (`12.5` is +12.5%, `-8.0` a decline). Null when unavailable — not 0%. This is the figure behind `sort` field `growth_metrics.employee_count_6mo_ratio`. Report it as growth: the headcount at the start of the window is not a published figure, so do not reconstruct one from this and the current value."
},
"employee_count_growth_12m_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Headcount growth over the trailing 12 months, as a percentage change (`12.5` is +12.5%, `-8.0` a decline). Null when unavailable — not 0%. This is the figure behind `sort` field `growth_metrics.employee_count_12mo_ratio`. Report it as growth: the headcount at the start of the window is not a published figure, so do not reconstruct one from this and the current value."
}
}
},
{
"type": "object",
"required": [
"linkedin_url",
"external_person_id",
"first_name",
"last_name"
],
"properties": {
"tagline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Person LinkedIn headline."
},
"location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Where the person lives: city and country."
},
"last_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Person last name."
},
"first_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Person first name."
},
"linkedin_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "LinkedIn URL."
},
"external_person_id": {
"type": "string",
"description": "External person ID."
},
"current_position_title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Current job title."
},
"current_position_company_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Current employer name."
}
}
},
{
"type": "object",
"required": [
"linkedin_url",
"signal_date",
"signal_score",
"signal_type",
"summary",
"industries",
"tech_verticals",
"is_industry_estimated",
"specter_talent_id",
"external_person_id",
"full_name",
"current_position_title",
"current_position_company_name"
],
"properties": {
"summary": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Signal summary."
},
"full_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Person full name."
},
"industries": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"description": "Industry classifications from the person's profile."
},
"signal_date": {
"type": "string",
"description": "Date of the talent signal."
},
"signal_type": {
"type": "string",
"description": "Signal type (e.g. 'New Company')."
},
"linkedin_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "LinkedIn URL."
},
"signal_score": {
"type": "integer",
"description": "Signal score."
},
"tech_verticals": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"vertical",
"sub_verticals"
],
"properties": {
"vertical": {
"type": "string",
"description": "Top-level tech vertical."
},
"sub_verticals": {
"type": "array",
"items": {
"type": "string"
},
"description": "Sub-verticals under this vertical."
}
}
}
},
{
"type": "null"
}
],
"description": "Tech-domain classifications from the person's profile, grouped by vertical."
},
"specter_talent_id": {
"type": "string",
"description": "Specter talent signal ID."
},
"external_person_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "External Specter person ID."
},
"is_industry_estimated": {
"type": "boolean",
"description": "Whether industries and tech verticals are estimated from the person's profile, including career history, roles, and other signals, rather than explicitly set.When True, display (Est.) next to the industry and tech vertical labels.When False, display the industry and tech vertical labels as is."
},
"current_position_title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Current position title."
},
"current_position_company_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Current position company name."
}
}
},
{
"type": "object",
"required": [
"linkedin_url",
"signal_date",
"signal_score",
"signal_type",
"summary",
"industries",
"tech_verticals",
"is_industry_estimated",
"signal_id",
"name",
"domain",
"signal_sources",
"featured_count"
],
"properties": {
"name": {
"type": "string",
"description": "Entity name."
},
"domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Company domain (company signals)."
},
"summary": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Signal summary."
},
"signal_id": {
"type": "string",
"description": "Interest signal ID."
},
"industries": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"description": "Industry classifications from the person's profile."
},
"signal_date": {
"type": "string",
"description": "Date of the talent signal."
},
"signal_type": {
"type": "string",
"description": "Signal type (e.g. 'New Company')."
},
"linkedin_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "LinkedIn URL."
},
"signal_score": {
"type": "integer",
"description": "Signal score."
},
"featured_count": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "Number of times this entity was featured in the last 360 days (e.g. 'Featured 4 times in the last 360 days')."
},
"signal_sources": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"description": "Source URLs or domains for the signal."
},
"tech_verticals": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"vertical",
"sub_verticals"
],
"properties": {
"vertical": {
"type": "string",
"description": "Top-level tech vertical."
},
"sub_verticals": {
"type": "array",
"items": {
"type": "string"
},
"description": "Sub-verticals under this vertical."
}
}
}
},
{
"type": "null"
}
],
"description": "Tech-domain classifications from the person's profile, grouped by vertical."
},
"is_industry_estimated": {
"type": "boolean",
"description": "Whether industries and tech verticals are estimated from the person's profile, including career history, roles, and other signals, rather than explicitly set.When True, display (Est.) next to the industry and tech vertical labels.When False, display the industry and tech vertical labels as is."
}
}
},
{
"type": "object",
"required": [
"linkedin_url",
"id",
"name",
"domain"
],
"properties": {
"id": {
"type": "string",
"description": "External investor ID."
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Investor name."
},
"domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Primary domain."
},
"hq_location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Headquarters location."
},
"founded_year": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Year the investor was founded."
},
"linkedin_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "LinkedIn URL."
},
"investor_types": {
"type": "array",
"items": {
"type": "string"
},
"description": "Investor type tags (e.g. 'VC', 'Angel')."
},
"number_of_exits": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Total number of portfolio exits."
},
"number_of_investments": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Total number of investments made."
}
}
},
{
"type": "object",
"required": [
"id",
"company_id",
"company_name"
],
"properties": {
"id": {
"type": "string",
"description": "External funding round ID."
},
"company_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "External ID of the company that raised."
},
"announced_on": {
"anyOf": [
{
"type": "string",
"format": "date"
},
{
"type": "null"
}
],
"default": null,
"description": "Date the round was announced."
},
"company_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Name of that company."
},
"investor_count": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Number of investors participating."
},
"investment_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Round type (e.g. 'Series A')."
},
"raised_amount_usd": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Amount raised in the round (USD)."
}
}
},
{
"type": "object",
"required": [
"id",
"acquirer_name",
"acquiree_name"
],
"properties": {
"id": {
"type": "string",
"description": "External acquisition ID."
},
"price_usd": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Deal price (USD), when disclosed."
},
"acquired_on": {
"anyOf": [
{
"type": "string",
"format": "date"
},
{
"type": "null"
}
],
"default": null,
"description": "Date the deal was announced."
},
"acquiree_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Acquiree company name."
},
"acquirer_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Acquirer company name."
},
"acquiree_domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Primary domain of the acquiree company."
},
"acquirer_domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Primary domain of the acquirer company."
},
"acquisition_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Deal type (e.g. 'acquisition', 'merger')."
},
"acquiree_company_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "External ID of the acquiree company."
},
"acquirer_company_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "External ID of the acquirer company."
}
}
},
{
"type": "object",
"required": [
"id",
"company_id",
"company_name"
],
"properties": {
"id": {
"type": "string",
"description": "External IPO ID."
},
"company_id": {
"type": "string",
"description": "External ID of the company that listed."
},
"company_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Name of that company."
},
"stock_symbol": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Ticker the company trades under."
},
"company_domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Primary domain of that company."
},
"went_public_on": {
"anyOf": [
{
"type": "string",
"format": "date"
},
{
"type": "null"
}
],
"default": null,
"description": "Date the company went public."
},
"share_price_usd": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Share price at listing (USD)."
},
"money_raised_usd": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Amount raised in the listing (USD)."
},
"valuation_price_usd": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Valuation at listing (USD)."
},
"stock_exchange_symbol": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Exchange the company listed on (e.g. 'nasdaq')."
}
}
}
]
},
"description": "Paginated results."
},
"search_name": {
"type": "string",
"description": "Name of the saved search."
},
"total_count": {
"type": "integer",
"description": "Total number of matching results."
},
"cutoff_source": {
"anyOf": [
{
"enum": [
"explicit",
"last_viewed",
"never_viewed",
"retention_limit"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Where `applied_cutoff` came from. 'explicit': the `new_results_after` you passed. 'last_viewed': the moment the user last opened this search. 'never_viewed': they never have, so the cutoff is the oldest tracked date instead. 'retention_limit': they last opened it before the tracked window starts, so the cutoff was moved forward to that start. Say so on the last two — the answer covers a shorter span than was asked for."
},
"applied_cutoff": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "The cutoff this page was actually scoped to, when one was applied; null for an unscoped page. `total_count` counts only the additions on or after it."
}
}
}
Original tool metadata
{
"name": "get_saved_search_items",
"title": "Get Saved Search Items",
"description": "List results returned by a specific saved search ID. Use `get_saved_searches` first to resolve a search name to an ID.\n\nThe product is inferred from the saved search; you do not pass it. \"What is new since I last checked?\" is `since_last_viewed=true` — never ask for a date. For a people search, `signal_mode='new_talent_signals'` returns TalentSignalItem entries, not PeopleSearchItem.\n\nShow search name, item count and search ID at the top. Render `industry` / `industries` and `tech_verticals` with a ` > ` separator, noting the industry is estimated when `is_industry_estimated` is true. Signal scores are 1-10.\n\nDefault — concise table: name (hyperlinked), social links, key metric. Hyperlink companies to `https://app.tryspecter.com/companies/all/{external_company_id}/overview`, people to `https://app.tryspecter.com/people/all/{external_person_id}/about`.\n\nTalent signals (people movements): Date | Person | Title | Company | Score | Signal Type | Signal Summary | Industry | Tech Vertical. Always show `signal_summary` (background + why notable) as a brief narrative below the row; a stealth company explains an estimated industry. Offer `get_person_profile` / `get_person_email` for follow-up.\n\nInvestor interest signals: Date | Name | Score | Signal Type | Signal Summary | Industry | Tech Vertical.\n\nInvestors (firms, e.g. VC funds): Name | Type | HQ | #Investments | #Exits — not hyperlinked.\n\nFunding rounds: Date | Company | Round | Raised (USD) | #Investors. Acquisitions: Date | Acquirer | Acquiree | Type | Price (USD), saying undisclosed rather than leaving a blank. IPOs: Date | Company | Exchange:Ticker (`stock_exchange_symbol`:`stock_symbol`) | Share Price (USD) | Raised (USD) | Valuation (USD). Hyperlink each company to `https://app.tryspecter.com/companies/all/{external_company_id}/overview` via `company_id`, or `acquirer_company_id` / `acquiree_company_id` for acquisitions.",
"inputSchema": {
"type": "object",
"required": [
"search_id"
],
"properties": {
"page": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "0-based page number."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 50,
"minimum": 1,
"description": "Max items per page (1-50)."
},
"search_id": {
"type": "integer",
"description": "The ID of the saved search to fetch results for."
},
"signal_mode": {
"enum": [
"all",
"new",
"new_talent_signals"
],
"type": "string",
"default": "all",
"description": "Optional. Selects which subset of results to return; the product is inferred from the saved search. Valid values per product:\n- company search: 'all' | 'new' (new this month)\n- talent-signals search: 'all' | 'new' (signals from this week)\n- people search: 'all' | 'new_talent_signals' (returns TalentSignalItem entries — new talent signals for the people in this search)\n- investor-interest-signals search: 'all' | 'new' (signals from this week)\n- investors search (investor firms): 'all' only\n- funding-rounds / acquisitions / IPOs search: 'all' only (transaction feeds are already ordered by deal date)"
},
"new_results_after": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional. Only return results added to this saved search on or after this moment (ISO 8601, e.g. 2026-07-10T00:00:00Z). Additions are tracked for the last 60 days; an older value is rejected. Not valid with `signal_mode='new_talent_signals'`, whose signals are not the entities tracked for a people search."
},
"since_last_viewed": {
"type": "boolean",
"default": false,
"description": "Optional. Only return results added to this saved search since the CURRENT USER last opened it in the app — the answer to \"what is new since I last checked\". The cutoff is read from the stored view time; you neither pass it nor ask the user for a date. The response reports the cutoff it used in `applied_cutoff` / `cutoff_source`. Not valid alongside `new_results_after` (which sets the cutoff itself) or a `signal_mode` other than 'all' (which applies a window of its own)."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"search_name",
"total_count",
"items"
],
"properties": {
"items": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"linkedin_url",
"id",
"name",
"domain"
],
"properties": {
"id": {
"type": "string",
"description": "External company ID."
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Company name."
},
"domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Primary domain."
},
"industry": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null,
"description": "Industry classification by economic activity (up to 3 levels)."
},
"ranked_by": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The growth window this page is ordered by, named with its unit — e.g. `Trustpilot reviews, 3-month growth (absolute change)`. Present only when `sort` ranked on a `growth_metrics.*` field; null for any other ordering. Use it as the column header when the ranking itself is the answer, and read the unit from it: the follower/download/visit families are a percentage change, the rating and review families an absolute one."
},
"highlights": {
"type": "array",
"items": {
"type": "string"
},
"description": "Monthly awarded tags for company growth patterns."
},
"web_visits": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Estimated website visits last month."
},
"founded_year": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Company founded year."
},
"growth_stage": {
"anyOf": [
{
"enum": [
"no_funding",
"bootstrapped",
"pre_launch",
"seed",
"early",
"growing",
"late",
"exit"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Company growth stage, as a raw enum value. Never render it as returned — always show the product's label for it: `no_funding` = Bootstrapped, `bootstrapped` = Bootstrapped, `pre_launch` = Pre-Launch, `seed` = Pre-seed / Seed, `early` = Early Stage, `growing` = Growth Stage, `late` = Late Stage, `exit` = Exit Stage."
},
"linkedin_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "LinkedIn URL."
},
"customer_focus": {
"anyOf": [
{
"enum": [
"b2b",
"b2b_b2c",
"b2c",
"b2c_b2b"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Customer focus. One of: 'b2b', 'b2c', 'b2b_b2c', 'b2c_b2b'."
},
"employee_count": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Number of employees."
},
"tech_verticals": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"vertical",
"sub_verticals"
],
"properties": {
"vertical": {
"type": "string",
"description": "Top-level tech vertical."
},
"sub_verticals": {
"type": "array",
"items": {
"type": "string"
},
"description": "Sub-verticals under this vertical."
}
}
}
},
{
"type": "null"
}
],
"default": null,
"description": "Tech-domain classifications grouped by vertical (up to 5 verticals, each with sub-verticals)."
},
"business_models": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null,
"description": "Business model tags (e.g., 'saas', 'marketplace', 'subscription')."
},
"ranked_by_value": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "This company's figure for the window `ranked_by` names, in that window's unit. Null when the company has no figure on file for it — not 0. Report it against `ranked_by`, never against a window's name you infer from the `sort` field yourself, and do not reconstruct the metric's value at the start of the window from it: that level is not a published figure."
},
"last_funding_date": {
"anyOf": [
{
"type": "string",
"format": "date"
},
{
"type": "null"
}
],
"default": null,
"description": "Company last funding date."
},
"short_description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "10-20 word company tagline (AI-generated)."
},
"last_funding_amount": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Company last funding amount (USD)."
},
"last_round_investors": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null,
"description": "Investor names from the most recent funding round."
},
"total_funding_amount": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Company total funding amount (USD)."
},
"web_visits_growth_3m_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Website-visit growth over the trailing 3 months, as a percentage change (`12.5` is +12.5%, `-8.0` a decline). Null when unavailable — not 0%. This is the figure behind `sort` field `growth_metrics.web_visits_3mo_ratio`. Report it as growth: the visit count at the start of the window is not a published figure, so do not reconstruct one from this and the current value."
},
"web_visits_growth_6m_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Website-visit growth over the trailing 6 months, as a percentage change (`12.5` is +12.5%, `-8.0` a decline). Null when unavailable — not 0%. This is the figure behind `sort` field `growth_metrics.web_visits_6mo_ratio`. Report it as growth: the visit count at the start of the window is not a published figure, so do not reconstruct one from this and the current value."
},
"web_visits_growth_12m_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Website-visit growth over the trailing 12 months, as a percentage change (`12.5` is +12.5%, `-8.0` a decline). Null when unavailable — not 0%. This is the figure behind `sort` field `growth_metrics.web_visits_12mo_ratio`. Report it as growth: the visit count at the start of the window is not a published figure, so do not reconstruct one from this and the current value."
},
"employee_count_growth_3m_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Headcount growth over the trailing 3 months, as a percentage change (`12.5` is +12.5%, `-8.0` a decline). Null when unavailable — not 0%. This is the figure behind `sort` field `growth_metrics.employee_count_3mo_ratio`. Report it as growth: the headcount at the start of the window is not a published figure, so do not reconstruct one from this and the current value."
},
"employee_count_growth_6m_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Headcount growth over the trailing 6 months, as a percentage change (`12.5` is +12.5%, `-8.0` a decline). Null when unavailable — not 0%. This is the figure behind `sort` field `growth_metrics.employee_count_6mo_ratio`. Report it as growth: the headcount at the start of the window is not a published figure, so do not reconstruct one from this and the current value."
},
"employee_count_growth_12m_pct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Headcount growth over the trailing 12 months, as a percentage change (`12.5` is +12.5%, `-8.0` a decline). Null when unavailable — not 0%. This is the figure behind `sort` field `growth_metrics.employee_count_12mo_ratio`. Report it as growth: the headcount at the start of the window is not a published figure, so do not reconstruct one from this and the current value."
}
}
},
{
"type": "object",
"required": [
"linkedin_url",
"external_person_id",
"first_name",
"last_name"
],
"properties": {
"tagline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Person LinkedIn headline."
},
"location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Where the person lives: city and country."
},
"last_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Person last name."
},
"first_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Person first name."
},
"linkedin_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "LinkedIn URL."
},
"external_person_id": {
"type": "string",
"description": "External person ID."
},
"current_position_title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Current job title."
},
"current_position_company_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Current employer name."
}
}
},
{
"type": "object",
"required": [
"linkedin_url",
"signal_date",
"signal_score",
"signal_type",
"summary",
"industries",
"tech_verticals",
"is_industry_estimated",
"specter_talent_id",
"external_person_id",
"full_name",
"current_position_title",
"current_position_company_name"
],
"properties": {
"summary": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Signal summary."
},
"full_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Person full name."
},
"industries": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"description": "Industry classifications from the person's profile."
},
"signal_date": {
"type": "string",
"description": "Date of the talent signal."
},
"signal_type": {
"type": "string",
"description": "Signal type (e.g. 'New Company')."
},
"linkedin_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "LinkedIn URL."
},
"signal_score": {
"type": "integer",
"description": "Signal score."
},
"tech_verticals": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"vertical",
"sub_verticals"
],
"properties": {
"vertical": {
"type": "string",
"description": "Top-level tech vertical."
},
"sub_verticals": {
"type": "array",
"items": {
"type": "string"
},
"description": "Sub-verticals under this vertical."
}
}
}
},
{
"type": "null"
}
],
"description": "Tech-domain classifications from the person's profile, grouped by vertical."
},
"specter_talent_id": {
"type": "string",
"description": "Specter talent signal ID."
},
"external_person_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "External Specter person ID."
},
"is_industry_estimated": {
"type": "boolean",
"description": "Whether industries and tech verticals are estimated from the person's profile, including career history, roles, and other signals, rather than explicitly set.When True, display (Est.) next to the industry and tech vertical labels.When False, display the industry and tech vertical labels as is."
},
"current_position_title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Current position title."
},
"current_position_company_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Current position company name."
}
}
},
{
"type": "object",
"required": [
"linkedin_url",
"signal_date",
"signal_score",
"signal_type",
"summary",
"industries",
"tech_verticals",
"is_industry_estimated",
"signal_id",
"name",
"domain",
"signal_sources",
"featured_count"
],
"properties": {
"name": {
"type": "string",
"description": "Entity name."
},
"domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Company domain (company signals)."
},
"summary": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Signal summary."
},
"signal_id": {
"type": "string",
"description": "Interest signal ID."
},
"industries": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"description": "Industry classifications from the person's profile."
},
"signal_date": {
"type": "string",
"description": "Date of the talent signal."
},
"signal_type": {
"type": "string",
"description": "Signal type (e.g. 'New Company')."
},
"linkedin_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "LinkedIn URL."
},
"signal_score": {
"type": "integer",
"description": "Signal score."
},
"featured_count": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "Number of times this entity was featured in the last 360 days (e.g. 'Featured 4 times in the last 360 days')."
},
"signal_sources": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"description": "Source URLs or domains for the signal."
},
"tech_verticals": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"vertical",
"sub_verticals"
],
"properties": {
"vertical": {
"type": "string",
"description": "Top-level tech vertical."
},
"sub_verticals": {
"type": "array",
"items": {
"type": "string"
},
"description": "Sub-verticals under this vertical."
}
}
}
},
{
"type": "null"
}
],
"description": "Tech-domain classifications from the person's profile, grouped by vertical."
},
"is_industry_estimated": {
"type": "boolean",
"description": "Whether industries and tech verticals are estimated from the person's profile, including career history, roles, and other signals, rather than explicitly set.When True, display (Est.) next to the industry and tech vertical labels.When False, display the industry and tech vertical labels as is."
}
}
},
{
"type": "object",
"required": [
"linkedin_url",
"id",
"name",
"domain"
],
"properties": {
"id": {
"type": "string",
"description": "External investor ID."
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Investor name."
},
"domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Primary domain."
},
"hq_location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Headquarters location."
},
"founded_year": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Year the investor was founded."
},
"linkedin_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "LinkedIn URL."
},
"investor_types": {
"type": "array",
"items": {
"type": "string"
},
"description": "Investor type tags (e.g. 'VC', 'Angel')."
},
"number_of_exits": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Total number of portfolio exits."
},
"number_of_investments": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Total number of investments made."
}
}
},
{
"type": "object",
"required": [
"id",
"company_id",
"company_name"
],
"properties": {
"id": {
"type": "string",
"description": "External funding round ID."
},
"company_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "External ID of the company that raised."
},
"announced_on": {
"anyOf": [
{
"type": "string",
"format": "date"
},
{
"type": "null"
}
],
"default": null,
"description": "Date the round was announced."
},
"company_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Name of that company."
},
"investor_count": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Number of investors participating."
},
"investment_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Round type (e.g. 'Series A')."
},
"raised_amount_usd": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Amount raised in the round (USD)."
}
}
},
{
"type": "object",
"required": [
"id",
"acquirer_name",
"acquiree_name"
],
"properties": {
"id": {
"type": "string",
"description": "External acquisition ID."
},
"price_usd": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Deal price (USD), when disclosed."
},
"acquired_on": {
"anyOf": [
{
"type": "string",
"format": "date"
},
{
"type": "null"
}
],
"default": null,
"description": "Date the deal was announced."
},
"acquiree_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Acquiree company name."
},
"acquirer_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Acquirer company name."
},
"acquiree_domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Primary domain of the acquiree company."
},
"acquirer_domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Primary domain of the acquirer company."
},
"acquisition_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Deal type (e.g. 'acquisition', 'merger')."
},
"acquiree_company_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "External ID of the acquiree company."
},
"acquirer_company_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "External ID of the acquirer company."
}
}
},
{
"type": "object",
"required": [
"id",
"company_id",
"company_name"
],
"properties": {
"id": {
"type": "string",
"description": "External IPO ID."
},
"company_id": {
"type": "string",
"description": "External ID of the company that listed."
},
"company_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Name of that company."
},
"stock_symbol": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Ticker the company trades under."
},
"company_domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Primary domain of that company."
},
"went_public_on": {
"anyOf": [
{
"type": "string",
"format": "date"
},
{
"type": "null"
}
],
"default": null,
"description": "Date the company went public."
},
"share_price_usd": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Share price at listing (USD)."
},
"money_raised_usd": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Amount raised in the listing (USD)."
},
"valuation_price_usd": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Valuation at listing (USD)."
},
"stock_exchange_symbol": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Exchange the company listed on (e.g. 'nasdaq')."
}
}
}
]
},
"description": "Paginated results."
},
"search_name": {
"type": "string",
"description": "Name of the saved search."
},
"total_count": {
"type": "integer",
"description": "Total number of matching results."
},
"cutoff_source": {
"anyOf": [
{
"enum": [
"explicit",
"last_viewed",
"never_viewed",
"retention_limit"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Where `applied_cutoff` came from. 'explicit': the `new_results_after` you passed. 'last_viewed': the moment the user last opened this search. 'never_viewed': they never have, so the cutoff is the oldest tracked date instead. 'retention_limit': they last opened it before the tracked window starts, so the cutoff was moved forward to that start. Say so on the last two — the answer covers a shorter span than was asked for."
},
"applied_cutoff": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"default": null,
"description": "The cutoff this page was actually scoped to, when one was applied; null for an unscoped page. `total_count` counts only the additions on or after it."
}
}
},
"annotations": {
"title": "Get Saved Search Items",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Run a Specter search from a natural-language DESCRIPTION of the records you want (e.g. 'climate-focused VC investors', 'high-growth fintech companies in Germany') and — when you know the kind of record you want — set `product`. Omit it to let Specter infer the product from the query.
This is for DISCOVERY, never for looking up an entity you can already name — 'find Stripe' / 'the person Jane Doe' belongs in `find_company` / `find_person`, which resolve a known name or domain directly.
`product` is one of: company, people, investors, talent_signals, interest_signals, funding_rounds, acquisitions, ipos. Use `investors` for the investor firms themselves (e.g. VC funds), not their portfolio companies.
Returns a compact list per product — the same fields the saved-search tools return, not the full record. Drill into a single result via the per-record tools (`get_company_profile`, `get_person_profile`, …) for the complete object. Also returns `query_id` / `agent_query_id`, a `search_url` to reopen the whole search in the app, and the `product` actually searched.
To order the results, pass `sort` — a list of `{field, direction}` (`direction` is `asc` or `desc`, default `desc`). Which fields a product accepts is product-specific and runs well beyond the obvious few; an unknown one is rejected with that product's full list, so an uncertain guess costs a call rather than the ranking. People searches can't be sorted.
When rendering results, hyperlink each item's name to its Specter page: `company` (field `id`), `funding_rounds`/`ipos` (field `company_id`) and `acquisitions` (field `acquiree_company_id`) link to a company feed at `https://app.tryspecter.com/companies/all/{external_company_id}/overview`; `people` (field `id`) and `talent_signals` (field `specter_person_id`) link to `https://app.tryspecter.com/people/all/{external_person_id}/about`. `investors` and `interest_signals` are not hyperlinked.
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
Natural-language description of what to search for.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
product
The product to search. Omit to infer it from the query.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
0-based page number.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Max items per page (1-50).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sort › anyOf › 0 › items › field
The field to sort by. Which names are valid depends on the product, and each has far more than a handful — look them up rather than recalling them. An unknown field is rejected with that product's full list.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sort › anyOf › 0 › items › direction
Sort direction; defaults to descending.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Save a search so it persists in Specter and is shared with the API. Run the `search` tool first to build the query — it returns a `query_id` — then pass that `query_id` here with a `name` to store it as a named saved search owned by the current user.
The product type is taken from the query, so no product argument is needed. Every product a query can carry — company, people, talent-signal, interest-signal, investor (firm), funding-round, acquisition and IPO — is listed by `get_saved_searches` and readable via `get_saved_search_items`.
Calling this twice with the same name and query is safe: the saved search you already have is returned. The same name over a different query fails — pick another name.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Display name for the saved search.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query_id
ID of the query to save, as returned by the `search` tool.
Clear enough to supply this argument.
is_public
Whether to share the saved search with the whole team.
Clear enough to supply this argument.
description
Optional description for the saved search.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"search_id",
"name",
"query_id",
"product"
],
"properties": {
"name": {
"type": "string",
"description": "The display name of the saved search."
},
"product": {
"type": "string",
"description": "The product type of the saved search (derived from the query), e.g. 'company', 'people', 'talent', 'stratintel'."
},
"query_id": {
"type": "integer",
"description": "The ID of the query the saved search references."
},
"search_id": {
"type": "integer",
"description": "The ID of the newly created saved search."
}
}
}
Original tool metadata
{
"name": "create_saved_search",
"title": "Create Saved Search",
"description": "Save a search so it persists in Specter and is shared with the API. Run the `search` tool first to build the query — it returns a `query_id` — then pass that `query_id` here with a `name` to store it as a named saved search owned by the current user.\n\nThe product type is taken from the query, so no product argument is needed. Every product a query can carry — company, people, talent-signal, interest-signal, investor (firm), funding-round, acquisition and IPO — is listed by `get_saved_searches` and readable via `get_saved_search_items`.\n\nCalling this twice with the same name and query is safe: the saved search you already have is returned. The same name over a different query fails — pick another name.",
"inputSchema": {
"type": "object",
"required": [
"name",
"query_id"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Display name for the saved search."
},
"query_id": {
"type": "integer",
"description": "ID of the query to save, as returned by the `search` tool."
},
"is_public": {
"type": "boolean",
"default": false,
"description": "Whether to share the saved search with the whole team."
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional description for the saved search."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"search_id",
"name",
"query_id",
"product"
],
"properties": {
"name": {
"type": "string",
"description": "The display name of the saved search."
},
"product": {
"type": "string",
"description": "The product type of the saved search (derived from the query), e.g. 'company', 'people', 'talent', 'stratintel'."
},
"query_id": {
"type": "integer",
"description": "The ID of the query the saved search references."
},
"search_id": {
"type": "integer",
"description": "The ID of the newly created saved search."
}
}
},
"annotations": {
"title": "Create Saved Search",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
Delete a saved search you own. Use `get_saved_searches` to resolve a search name to its ID. Only the owner can delete a saved search; otherwise this returns Not Found.
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.
search_id
The ID of the saved search to delete.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"search_id",
"deleted"
],
"properties": {
"deleted": {
"type": "boolean",
"description": "Whether the saved search was deleted."
},
"search_id": {
"type": "integer",
"description": "The ID of the deleted saved search."
}
}
}
Original tool metadata
{
"name": "delete_saved_search",
"title": "Delete Saved Search",
"description": "Delete a saved search you own. Use `get_saved_searches` to resolve a search name to its ID. Only the owner can delete a saved search; otherwise this returns Not Found.",
"inputSchema": {
"type": "object",
"required": [
"search_id"
],
"properties": {
"search_id": {
"type": "integer",
"minimum": 0,
"description": "The ID of the saved search to delete."
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"required": [
"search_id",
"deleted"
],
"properties": {
"deleted": {
"type": "boolean",
"description": "Whether the saved search was deleted."
},
"search_id": {
"type": "integer",
"description": "The ID of the deleted saved search."
}
}
},
"annotations": {
"title": "Delete Saved Search",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
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.
01SearchRun a Specter search from a natural-language DESCRIPTION of the records you want (e.g.
02Get ListsList accessible lists for the current user.
03Find CompanyFind ONE SPECIFIC company you can already name — by external ID, LinkedIn URL, website/domain, or exact name — and return its core profile.
04Get the current user information
05Get Saved SearchesList saved searches accessible to the current user, for any product: company, people, talent signals, investor interest signals, investors (firms), and the t…
Want to run these tasks against your MCP server with us?
Specter setup, tools, quality score, publishing readiness, and alternatives.
How do I add Specter to Claude, ChatGPT, or Cursor?
Add Specter 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.tryspecter.com/mcp.
Is Specter MCP ready for ChatGPT and Claude?
As of November 10, 2026, Specter scores 100/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 Specter's MCP tool documentation?
As of November 10, 2026, Specter scores 87/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 32 of 32 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What are the best alternatives to Specter?
As of November 10, 2026, alternatives to Specter in financial-services on the Manufact MCP leaderboard include paidfor: x402 seller reliability, CoinGecko, Coverage Cat Insurance, aiwyn, and Netzo.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.