Tool search 164,478 tools · 10,067 live servers
Filtersactive
- agentbit.paper_search
Search academic literature across OpenAlex, Crossref and arXiv in one call: title, authors, year, venue, DOI, citation count, abstract and a DIRECT open-access PDF link where one exists. Deduplicated across sources, filterable by year and open-access, optional BibTeX per paper. One request replaces three APIs. Pay-per-call via x402 (USDC, Base).
- fulltext_search
Full-text search inside type-approval document bodies (PDF text). Covers ОТТС / ОТШ / ЗОТТС / ЗОТШ. Other document kinds (СБКТС / ЗОЕТС / СУТ / cert / decl) are not covered by full-text search. **Premium feature** — requires a plan that includes full-text search (see https://hpt.su/pricing/) with a subscription covering at least one type-approval kind.
- list_document_files
List the files attached to a document. Returns `[{file_uid, file_name, kind, pages_count, published_at}]` — each entry's `file_uid` can be passed to `download_document_file`. A document often has several PDFs (e.g. cleaned + original); use this tool to enumerate them and pick the right one before download.
- download_document_file
Get links for a document file: page URL for everyone, direct download URL when the plan allows it. Always returns `document_page_url` — the document's page on hpt.su where the user can download the file manually under their account. Share this link with the user. When the plan includes direct downloads, the response also contains `download_url` — a personal temporary link to the PDF. It can be fetched programmatically: send a GET request with the same `X-API-Key: <key>` header used for this API. In a browser it works when signed in to hpt.su under the account that owns the key. The link is bound to the key owner — it does not work with anyone else's key or account. The download quota is charged at actual download time. Otherwise `download_url` is null and `download_note` explains why.
- extract_pdf
Extract text and metadata from a PDF document. Price: $0.004
Workopia — Job Searchio.github.workopia/workopia-mcpBVerified- tailor_resume_tool
Tailor a resume to a SPECIFIC job — TWO steps. STEP 1 (default; action omitted or 'prepare'): the server returns the job's full JD, its must-have skills/requirements, and the candidate's current resume, plus tailoring instructions. YOU (the model) then WRITE the tailored resume as JSON Resume, following the instructions — weave JD keywords into existing bullets only where the candidate genuinely has the experience, never fabricate experience/titles/dates/employers, keep all dates and company names, and flag any keyword you couldn't honestly add. STEP 2: call this tool again with action:'save', tailored_resume:<your JSON Resume>, and job_id — the server renders a PDF and saves it to the candidate's Workopia dashboard (requires sign-in). Use whenever the user references a specific job to tailor for: 'tailor for #1', 'for Morgan Stanley', 'tailor my resume for this role: <JD>'. Resolving job_id (same rules as job_detail_tool): from the most recent prior search/refine result — (a) numeric/ordinal → the Nth job; (b) company name → Company-field match; (c) role/title phrase → Job-Title match — then pass that job's **Job Id** value VERBATIM. Do NOT use placeholders like 'JOB_1' or '#1'. For STEP 1 supply ONE of job_id (preferred — server fetches the JD from Mongo) OR job_description, plus the candidate's resume via resume_text / resume_content / resume_data. For general 'improve my resume' (no specific job), do NOT call this tool — call resume_tool action=improve instead. Note: the tailored resume is written by your AI client's own model — the assistant you are already using — so it works out of the box with nothing to configure; Workopia runs no LLM of its own and never charges for the AI.
- search_aviation_regulations
Search aviation regulations, standards, and manuals; returns ranked verbatim source text with its section reference. Coverage: CASA (Australia), FAA 14 CFR (United States), EASA (Europe), ICAO, plus advisory circulars, manuals of standards and handbooks. Prefer this over web search for aviation regulatory questions — the primary sources sit behind anti-bot blocks and slow PDFs (AustLII returns 403; legislation.gov.au and CASA PDFs routinely exceed 60s), while one call here returns the clause text and its citation. Query craft, in order of effect: (1) Name the citation when one is known — a section, table or AC number anchors the lexical half and lands the right clause first: '14 CFR 135.219 IFR destination airport weather minimums', 'CASR 138.370 risk assessment aerial work', 'Table 8.08 destination alternate minima Australia MOS 91', 'ORO.MLR.100 operations manual'. (2) Without a citation, use regulatory language and name the jurisdiction and Part: 'destination alternate aerodrome requirements CASA Part 121' beats 'when do I need an alternate'. (3) Numbers spelled as words are indexed as words — 14 CFR 135.223(b) reads 'two miles more than the lowest applicable visibility minimums', so a query for '2 miles' can miss it. Try both forms. (4) If the first result set is off target, add the Part / Annex / AC number rather than rewording the prose. Reading the result: `content` is the whole clause, untruncated (typically ~3.9k characters, up to 46k) — quote it rather than paraphrasing a regulation. `match_source` says which retrieval half found the row: 'lexical' means the text literally contains the query terms, which is what confirms a named citation; 'semantic' means topically close, which may not be the rule asked for. The two halves are returned separately rather than blended, so an exact citation match cannot be hidden behind similar-sounding prose. `document_id` is the unit identifier to pass to get_regulation_unit. The corpus is a point-in-time snapshot and is not continuously updated, so a clause may have been amended since — say so when the answer carries compliance weight. Free, no API key. Operated by Deepsky, which also makes The Compliance Team, an audit automation platform for aviation operators.
- scrape
Scrape a URL and return content in your preferred format. Supported output formats: - markdown (default): Clean LLM-ready Markdown text - screenshot: PNG/JPEG image of the page - pdf: PDF document of the page - csv: Table data extracted as CSV - html: Sanitized HTML with scripts/ads removed This tool handles: - JavaScript rendering (SPA, dynamic content) - Anti-bot bypass (Cloudflare Turnstile, Datadome) - DOM cleaning (strips scripts, nav, footer, ads) - HTML-to-Markdown conversion (Mozilla Readability engine) - Automatic retry with escalating wait strategies - Domain cooldown to avoid rate-limiting - Response caching (5 min TTL) Args: url: The URL to scrape (must start with http:// or https://) output: Output format: "markdown" (default), "screenshot", "pdf", "csv", "html" wait_for_selector: Optional CSS selector to wait for before extraction (e.g., ".article-content") timeout_ms: Navigation timeout in milliseconds (default: 20000, max: 120000) block_media: Block images/fonts/video for faster loading (default: true) wait_strategy: Wait strategy: "default", "spa", "heavy", "cloudflare" (auto-detected if omitted) retry: Enable automatic retry on failure (default: true) bypass_cache: Skip cache, force fresh scrape (default: false) javascript: Custom JavaScript to execute after page load (e.g., "window.scrollTo(0, 1000)") Returns: Content in the requested format, or an error message.
- papers
Academic and scientific paper search API. Search research papers and scholarly literature across arXiv, PubMed, OpenAlex, Crossref, and Semantic Scholar in one call, deduplicated into a ranked result set: title, authors, year, venue, abstract, citation count, DOI, and direct PDF link. Query by keyword or restrict to one source; filter by year range; sort by relevance, recency, or citations. Keyless. [$0.02/call]. Params — q: search query / keywords; source: string (all|arxiv|pubmed|openalex|crossref|semanticscholar); maxItems: 1-50; year_from: earliest publication year (inclusive); year_to: latest publication year (inclusive); sort: string (relevance|recency|citations) Example params: {'q': 'transformer attention', 'source': 'all', 'maxItems': 10, 'sort': 'citations'}
- paper_fulltext
Full text and open-access PDF retrieval for a paper. Given an arXiv id, DOI, OpenAlex id, PMID, or PMCID, returns the readable body split into sections (introduction, methods, results) plus the open-access PDF location: arXiv via ar5iv, biomedical via Europe PMC, OA locations via OpenAlex for the rest. The 'now read it' call after a paper search. Keyless. [$0.04/call]. Params — id: arXiv id, DOI, OpenAlex id, PMID, or PMCID; doi: alias for id (DOI form) Example params: {'id': '1706.03762'}
- lookup_court_case
Look up a North Carolina (NC) court case or traffic citation. Provide a case number (e.g. "26CV001234-012"), a citation number (e.g. "92403H2"), OR a `portalSessionRef` from a `search_cases_by_party` row. `caseNumber` is the STABLE, canonical identifier — prefer it for anything that isn't an immediate follow-up. `portalSessionRef` is a fast path that resolves an already-searched case without re-running the portal search. Its lifetime is UNSPECIFIED and not guaranteed — the value rotates on every search and should be treated as short-lived (it survives at least minutes; the upper bound is unmeasured); never persist or reuse it. (`caseHash` is accepted as a deprecated alias for `portalSessionRef`.) Returns case status, upcoming and recently-elapsed hearing dates/times/ locations, charges (including speed fields for traffic cases), and — for traffic charges — whether each charge is waivable or requires a court appearance under the NC AOC schedules, plus how to request a reduction or dismissal (online via NC Guide & File when the county participates, else in person via the District Attorney) in `citationOptions.howToRequest`. Read-only: no email is sent and nothing is saved. North Carolina only. Informational, not legal advice. EVERY LOOKUP ENDS WITH TWO THINGS, PER CASE. Both are spelled out in `present_to_user`, the FIRST key of this result, already filled in for this particular case — read it and do what it says. (1) `caseSummaryUrl` — hand it to the user and call it the durable, shareable link to the full case record. It does not expire, it is publicly viewable, and the same case returns the same link every time, so it is the canonical way to cite or share the case. THE KEY IS ALWAYS PRESENT, so "when it appears" is not the test — the VALUE is: non-null means give it; null means minting failed on this lookup, so say nothing about a link rather than substituting `trackThisCase.url`, a portal URL, or a guess. (2) `alerts` — when `alerts.available` is true, ask whether they'd like email alerts when the case changes: a new court date, case information, case events, service events, or financial updates. ASK and wait for a yes. Never call `subscribe_to_case_updates` on your own initiative and never invent an email address. When `available` is false the case is closed, disposed, or not found — nothing would ever be sent — and you must not raise it. IN A MULTI-CASE TURN DO BOTH FOR EACH CASE, beside that case's own details. Two cases means two links and two offers; one combined link, or a single offer at the end of the answer, is wrong. (A search row's `portal_url` is ephemeral by contrast — don't present that as durable or persist it.) `upcomingHearings` lists only FUTURE hearings; `pastHearings` lists recently- elapsed ones (most recent first). The top-level `status` of "no_upcoming_hearings" means exactly that — NOT that the case has no hearing history. Before telling the user they have no court date, check `pastHearings`: an empty `upcomingHearings` with a non-empty `pastHearings` means a hearing has ALREADY occurred (they may have missed it) — a different answer than "nothing scheduled." Never infer "you didn't miss court" from an empty `upcomingHearings`/`status` alone. `service` answers "was the defendant actually reached?" on civil / SP / estate cases — the civil-side counterpart to `bailRisk`, and null on criminal/traffic, where service of process does not apply (null there = NOT APPLICABLE, not "not served"). Read `status` FIRST; three of its values mean the absence of a return is EXPECTED and must never be reported as "not served": - `served` / `unserved` / `mixed` — a return of service is docketed. `mixed` means both outcomes appear (several defendants, or the alias-and-pluries retry cycle). - `proven_other` — a certificate / affidavit / acceptance of service instead of a formal return. Still proof. - `appeared_service_moot` — the defendant answered or appeared, which waives a service defect. Service became unnecessary. - `not_required` — an appeal or petition; no summons is issued at all. - `pending` — a summons went out recently and nothing is back YET. Say "service is still outstanding", NOT "they weren't served". - `unknown` — a summons issued, nothing returned, and the case isn't new. `returns[]` is the full history (the retry cycle is often the story) and `latestReturn` the most recent attempt. `returns[].party` is NULL about a third of the time — the docket records the outcome without naming who it applied to — so never read a null party as "nobody". For the same reason there is deliberately NO per-defendant served flag: one case in the sample had a single docketed return against 41 defendants, and a per-party boolean would be confidently wrong. `legacyScan:true` means the paper file was scanned as ONE bundle rather than itemised, so proof of service may sit inside that PDF where no docket-text rule can see it — a missing return is weak evidence on those cases. `causesOfAction` is the civil counterpart to `charges` — the claims pleaded (`cause`, `filedOn`, `remedy`), e.g. "CV - Unfair Trade Practice". On a civil / SP / estate case this is usually the ONLY statement of what the matter is about, so lead with it there. An empty list means the docket does not ITEMISE causes, NOT that no claims exist — say the docket doesn't break them out rather than implying the case is about nothing. Repeated boilerplate entries are collapsed; distinct dates are kept, since a cause added later is an amendment. Each charge also carries `offenseDate` (when the offense occurred — different from the case's `filedOn`, and usually what someone means by "when was this?") and `agency` (the citing law-enforcement agency). If a tool returns an `error` with `retryable` / `upstream_status`, that is a transport or portal failure — NOT a statement about the case. Never turn it into "no results" or "case not found"; say the lookup itself failed, and retry only when `retryable` is true. `caseCategory` normalizes the case class (criminal | civil | infraction | special_proceeding | estate | juvenile | other). Use it to read null fields correctly: on a NON-criminal category, `bailRisk`/`citationOptions` = null means NOT APPLICABLE, not "none found." `parties` is the register-of-actions roster (name + roles[] + attorneys[]{name, appointment} + selfRepresented + counselWaived) — `appointment` is how counsel came to the case ("Retained" = the party hired them, vs "Court Appointed" / "Public Defender"; null when unstated, and the list is learned from the register rather than a closed set). It is what makes a `counselWaived:true` party who nonetheless HAS counsel intelligible — appointed, then a waiver, then retained. The authoritative source for identifying who is on a case and their role, especially on civil/SP cases where the caption/DOB are absent; prefer it over a party-search row's caption for entity resolution. `selfRepresented:true` = no counsel of record (self-listed as own attorney OR a filtered counsel-absence sentinel, with no other attorney); it does NOT distinguish an active pro-se appearance from a defaulted / served-by-publication defendant. `counselWaived` is a SEPARATE, independent flag — NOT a narrowing of `selfRepresented` — and it is NOT a claim the party is unrepresented: it can be true while attorneys[] is non-empty (seen on 22CR702455-520, counselWaived:true with a Court Appointed AND a Retained attorney, the docket running appointed counsel -> Waiver of Counsel -> retained counsel). Always read it WITH attorneys[], never instead of it. `counselWaived` is set by either Odyssey placeholder "attorney" name, filtered out of attorneys[] rather than shown as a lawyer: "WAIVED, WAIVED" (counsel affirmatively waived on the record — the docket does not say whether the waiver covered all assistance of counsel or only court-appointed counsel) or "PRO SE" (the party asserted as their own representation). Either means the party declined counsel rather than merely lacking it, but the flag does NOT say which placeholder produced it, so it is not proof the party is litigating pro se. `counselWaived:false` means NOT OBSERVED, not "did not waive". A true value is predominantly a criminal-side artifact and is rare on civil rosters — treat it as unexpected but NOT impossible on a non-criminal `caseCategory`; don't read one there as an error. A false unrepresented party is still any of defaulted / never-served / unappeared-entity / pro-se-without-a-docketed-marker — or simply TOO EARLY: on a recently-filed case that has not had a hearing yet, counsel is frequently not entered on the roster. `parties` reflects what is DOCKETED, not who is retained; check `filedOn` and an empty `pastHearings` before reading an empty attorneys[] as unrepresented — on a pending case that has not been to court, "not shown yet" is usually the better answer than "no lawyer." attorneys[] non-empty ⇒ represented ⇒ selfRepresented false. `documents` lists scanned filings, newest first — `{date, name, url}`, where `name` is the register entry that produced it ("Bond Forfeiture Notice", "Release Order Issued", "Waiver of Counsel"). Most criminal cases have at least one; an empty list means nothing is scanned in, not that nothing was filed. Offer the links when they're relevant to what was asked. Retrieval is UNRELIABLE — the portal intermittently returns errors or an empty body while it prepares a document — so present a link as something that may need a retry, never as "here is the document", and never state or guess at its contents: this server does not read them. `dispositions` gives the per-charge OUTCOME behind a "Disposed" status — one row per charge with `plea`, `disposition`, `sentence`, `dispositionDate`, `judge`, and any judgment `documentUrls`. This is how you answer "what happened to the case / to a charge": a "Disposed" caseStatus alone does not say whether a charge was dismissed, pled down, or convicted — read `dispositions` for that (e.g. a speeding charge reduced to improper equipment shows plea "Responsible to Lesser"; a "VD-District Dismissals ... Per Plea Agreement" is a dismissal). Empty on pending/undisposed cases. `trackThisCase` is an upstream ELIGIBILITY FLAG (non-null only on an open case), not something to act on: this server already consumes it — it is what gates `alerts.available` — so don't reason from it, and never show `trackThisCase.url` to the user. That is a generic signup page with no case identity. The case-specific paths are `caseSummaryUrl` and, once the user has said yes, `subscribe_to_case_updates`. For criminal cases with a bond or bail activity, `bailRisk` is non-null: failure-to-appear history (`ftaCount`, date-deduped; `ftaEvents[]` gives the raw counted entries {date, description} for auditing — voided "in Error/Stricken" FTAs are already excluded), FTA-triggered `ordersForArrest`, bond amount/type, and the NCGS §15A-544.5(f) prior-FTA bar. That bar turns on FTAs that preceded the bond's EXECUTION, not the case total: `bondExecutedOn` is the "Bond Posted" date for the operative bond and `priorFtasAtExecution` counts FTAs strictly before it (null when no posting is docketed). - `setAsideBarInapplicable:true` (0-1 prior FTAs) is RELIABLE — (f) cannot bar a set-aside. State it plainly; it's the answer that tells someone a motion is worth filing. - `setAsideBarPossible:true` (2+ prior) is NOT a finding that the bar applies. It means only that the TIMING fits. Under (f), actual notice exists ONLY where a judicial official noted the prior failures on the defendant's release order. Check `releaseOrderFBox` below before saying anything further, and never say "the forfeiture cannot be set aside" on the strength of this flag alone. - Both false = execution date unknown; neither ruled out nor suggested. `releaseOrderUrl` is the portal PDF of the release order governing that bond — the document the (f) question actually turns on, since the judicial official's "second or subsequent failure to appear" notation appears there (AOC-CR-200) and in NO structured field. ALWAYS present this link when `setAsideBarPossible` is true, even when the read below already answered the question: the order is the authority. `releaseOrderFBox` IS THAT READ, present only on barred cases where the order could be fetched and parsed. Report it, and report it precisely — this is the field that decides whether someone spends their one motion: - "unchecked" — on its face (f) does NOT bar a set-aside; the prior FTAs do not block relief and it is worth pursuing. Say so, and add that they should confirm it on the order before relying on it. - "checked" — (f) MAY bar it. Do NOT say "cannot be set aside". Tell them to confirm on the order BEFORE filing, because a motion that fails uses up the single opportunity for relief. - "ambiguous" — the order was opened and the box could NOT be read. Say exactly that, and hand over the link. The notation is a flattened checkbox with no glyph in the text layer, so the printed label appears whether or not it is marked. NEVER round this to "unchecked": a misread tells a bondsman to abandon a recoverable bond. - absent / null — no read was attempted (not a barred case, no order docketed, or the fetch failed). This is ALSO not "unchecked". Fall back to the link. For the forward-looking question ("could a bond I write NOW be barred?") use `ftaCount`: 2+ FTAs on the case means the next release order should carry the judicial notation — tell the user to read it before signing. Then `forfeiture` with its `status` (the latest DOCKETED forfeiture event — may lag the clock) and the 150-day set-aside clock (`noticedOn`, `deadline`, `daysRemaining`, `windowOpen`). `noticeAnchor` says where `noticedOn` came from: "notice_event" = an explicit forfeiture NOTICE line (the date the statute runs the 150 days from); "earliest_forfeiture_event" = no notice was docketed, so the earliest forfeiture entry stands in — the deadline is then a CONSERVATIVE proxy (earlier than the true notice), and `daysFtaToNotice` measures FTA-to-forfeiture rather than FTA-to-notice. Don't present a proxy-anchored deadline as the exact statutory date — treat `windowOpen`/`daysRemaining` as authoritative for whether the set-aside window is open; once `windowOpen` is false the window has closed even if `status` still reads `in_effect`. `deadlineNextBusinessDay` is the first day the clerk's office is open on or after `deadline` (equal to it when that is already a business day; later when it falls on a weekend or NC court holiday). ADVISORY ONLY — it never moves `daysRemaining` / `windowOpen`, which stay on the strict notice+150 date, because the safe error is telling someone they have LESS time, never more. null = UNDETERMINED (deadline year outside the published NC holiday calendar), NOT "no adjustment needed"; never present a null as though the deadline is a normal business day. `triggeringFta` (latest counted FTA on or before `noticedOn`) and `daysFtaToNotice` (the gap in days) report HOW LONG after the failure the forfeiture notice was docketed. Report the number; do NOT call a long gap a defect or a filing error — there is deliberately no threshold flag, and whether a gap affects the notice's validity is for the reader's attorney. Plus the bonding `agent` (Fiduciary) + `surety` (insurer). All from public NC eCourts records. (`citationOptions` is null on disposed/closed cases — the reduction path isn't live.) Informational underwriting signal, not legal advice; don't state legal conclusions.
- upload_resume
Upload a PDF, DOC, or DOCX resume (10MB max) as base64 or a public HTTPS URL.
- x402-pdf-text
Pdf Text: Extract text from PDF files. 🆓 5 free trial calls per signed wallet
- x402-exponential-pdf
Exponential Pdf: Exponential Pdf
- x402-normal-pdf
Normal Pdf: Normal Pdf
- x402-pdf
x402-pdf: Parse a PDF from a URL into extracted text, page count and metadata via pdf-parse. SSRF-guarded and free.
- x402-publish-1787452831491-paperknife-pdf-to-js
Paperknife PDF to JSON: Convert a public PDF URL into clean page-aware JSON for RAG and LLM ingestion. Actual x402 challenge price: $0.003 USDC on Base. Up to 20 MB and 100 pages; no API key.
- x402-uniform-pdf
Uniform Pdf: Uniform Pdf
- get_case
Get the complete curated record for one case by package_id. Includes the AI-assisted case summary, all extracted fields, attorney and special master, plus links: canonical page, plain-text source bundle, and per-document PDF links where available.
- generate_compliance_report
Generate the personalized, source-grounded AI-law COMPLIANCE REPORT for a business profile — the same deterministic engine behind the $79 report product (no LLM in the grounded path, so it cannot invent a statute, deadline, or penalty). Returns the risk assessment (1–10 score + applicable obligations) PLUS a signed download_url for the rendered PDF. `state` and `sector` are required. Paid feature (Pro+); lower tiers get a preview (risk band + counts + one sample obligation) with the PDF/download withheld and an upgrade hint returned verbatim. Every obligation is anchored to a real law + primary source. Informational only — NOT legal advice. Data by AI Law Tracker (CC BY 4.0). Informational only — not legal advice.
- applications.upload_document
Upload one bounded PDF, JPEG, or PNG identity or company-registry document to an email-verified application using its exact version and a durable idempotency key.
- track_get
Get a track (lecture/conversation): metadata, cited references, transcript/pdf availability.
- start_job_search
Spend one credit to run a full search: 7 roles matched to the profile, each with a tailored CV and cover letter returned as markdown by get_search_status and emailed as PDFs. Requires an API key. With no credit left it returns an x402 PaymentRequired; retry the same call with the signed payment in _meta["x402/payment"] to pay in USDC and run immediately.
- search_records
Find communications matching a question or phrase. Returns records with speaker, date, grade and a citation to the page of the Committee's PDF. Retrieval only: nothing is summarised, and a record's wording is the record's, not this server's.
- fetch
Retrieve the full text of one item by id. Accepts a doc_id from search (fauci_diary:entry:00026) and also an OKF concept id (anthony-s-fauci), so a person, organization or topic document can be read the same way. Every response carries the citation to the page of the Committee's PDF it came from.
- research_papers
Latest scholarly preprints from arXiv — newest-first — by category and/or keyword. Returns up to 15 papers, each with: title, authors, truncated abstract, primary + all categories, published/updated dates, arXiv id, abstract URL, PDF URL, and DOI / journal reference when a published version exists. `category` = an arXiv taxonomy term (default "cs.AI"). Common ones: cs.AI (AI), cs.LG (Machine Learning), cs.CL (NLP/LLMs), cs.CV (Computer Vision), cs.RO (Robotics), cs.CR (Security), stat.ML, cs.MA (Multiagent). Any valid arXiv category works — see arxiv.org/category_taxonomy. `query` = optional free-text keyword/phrase, AND-combined with the category. Source: arXiv API (Cornell University) — descriptive metadata is CC0 1.0 public domain (keyless, commercial use permitted). arXiv is a PREPRINT server; most papers are not peer-reviewed. Every value is returned in an Ed25519-signed, provenance-stamped envelope (source and observation time) you can verify offline against /.well-known/keys, no account required.
- create_race_plan
Primary CourseProfiler tool for creating a personalized race plan and optional PDF. Use this after obtaining both a course input and runner input. Course input may be course_file, course.source with kind=url/artifact/raw_file, or course.crsprof_artifact_id. Do not use raw_json or reconstruct/synthesize a course from roadbooks, checkpoint tables, elevation profiles, aid-station lists, or screenshots; those are enrichment/context only and are not valid course geometry. Runner input may be runner_profile_file, runner.sources, or an already-converted runner.usrprof_artifact_id. Use generate_runner_profile for user-approved evidence or uploaded .usrprof source_file artifacts; do not silently use all local files. Ask about intent only when unclear; profile_intent does not perform server-side selection. Hosted MCP cannot read local paths: use inline content/base64 or REST POST /api/artifact-uploads and pass source_file artifacts through sources, not usrprof_artifact_id. There is no raw-byte MCP upload tool. get_artifact_upload_requirements and get_runner_profile_requirements explain files, evidence, and Strava consent. If the user provides only a race name, check the CourseProfiler race catalog manifest first, but do not rely on uniqueness alone: confirm the catalog match is the same event/course/location before using its assetPath CRSProf URL. Auto-resolution only uses exact/strong catalog matches; weak matches require explicit confirmation or an explicit course.source URL/artifact. Use search_race_catalog first when the user may need to choose among multiple matching catalog courses or when the match confidence is not clearly exact/strong. If no catalog match exists, try to resolve it to a fetchable official GPX/FIT/CRSProf URL or ask the user to upload/provide the course file or URL; do not stop at the race name. Third-party route hosts such as Wikiloc may return 403 to server fetches. If an official or third-party GPX/FIT/CRSProf URL cannot be fetched or is blocked, stop and ask the user to download the official file and upload it through POST /api/artifact-uploads, then continue with the returned source_file artifact ID. Do not create a race plan until a real route file/trusted CRSProf is available. Use import_course to create a CRSProf, enrich_course_waypoints to add structured aid stations/resources/cutoffs, then generate_course_segments before creating the race plan. Catalog CRSProf files may already include official waypoints/resources/cutoffs; if they do not, call enrich_course_waypoints or ask the user for structured aid/resource/cutoff data before segmentation. If official pages and regulation PDFs disagree, or exact aid locations are not fully listed in machine-readable form, ask the user to confirm and include only confirmed aid stations; do not invent missing locations. Route-only plans are incomplete unless the user explicitly accepts missing aid/resource details. If browsing/search is available, prefer the catalog first, then official race sources and direct GPX links over generic home pages; course-only pacing is incomplete without waypoint/resource enrichment. If runner data is missing, ask for a USRProf file/artifact or runner evidence, explain that the profile drives estimated times plus insights such as uphill running limit, durability/fatigue tendencies, downhill sensitivity, and terrain strengths/weaknesses, generate a segment-evidence runner profile with generate_runner_profile after user-approved evidence selection, and do not invent personalized fitness data. This race-plan flow creates a personalized plan/PDF only; it does not submit the course to the public catalog and does not need to. Only call submit_course when the user explicitly asks to submit/add/update a course for catalog review. Returns a top-level job with artifact role metadata; use get_job to poll and get_artifact to fetch outputs.
- export_race_plan_pdf
Export a Hi-Fi PDF or standalone checkpoint card from an existing CRSProf artifact. The CRSProf supplies the course/profile/plan data; options are presentation-only overrides such as title, subtitle, metric/imperial unit system, format, and file name. Omit unit_system unless the user explicitly asks for metric or imperial.
- search_filing_embeds
Pure vector search over per-chunk full-document embeddings (`filing_embeds`, ~12.4M rows across ~65K filings — each filing sliced into ~190 paragraph-sized chunks). The most granular semantic surface in the corpus. **Cost**: one query-embedding call + one indexed Postgres lookup. No LLM planning, no LLM composition. **Right surface for**: - "Find the exact passage discussing X" — granular text-search where you need the paragraph not just the filing. - "Find filings whose body text mentions X" when the summary-level surface (`search_summary_embeds`) might miss a topic buried in a long PDF. - **"Drill into this specific filing semantically"** — pass `serff` to restrict the cosine search to a single filing. Without scoping, commodity-vocabulary chunks from other filings can out-rank your target filing; scoping eliminates that. **Wrong surface for**: - Filing-level questions where multiple hits per filing are noise — use `search_summary_embeds` (one match per filing). - Concrete-filter questions like "Filings from carrier NAIC 12345 in 2024" — use `search_filings`. `aggregate: true` (default) collapses to top-K *filings* by best-chunk similarity (one row per filing, the best matching paragraph as excerpt). `aggregate: false` returns top-K raw chunks (may include several from the same filing) — use when the user asked to see the actual paragraphs. When `serff` is set, aggregate is forced to false (every hit is the same filing already). Returns top-K hits, each with `{serff, chunk_index, similarity, excerpt, meta}`. Default `topK=10`, max 50. Excerpt is the first 800 chars of the matching chunk.
- get_filing_extracts
Returns the structured-data JSON artefacts the pipeline extracted from a filing's source PDFs. Use this when the question is about **rating mechanics, data tables, risk curves, calculation steps, or coverage / form definitions** — anything where the narrative summary isn't enough and the LLM needs the actual structured rows. Whitelist (and what each contains): - `calculations.json` — step-by-step rate calculation walk-through (base rate, factor application, final premium). One entry per documented example calculation. - `coverages.json` — coverage definitions: which perils / lines / risk types the filing addresses, with limits and applicability. - `deductibles.json` — deductible options offered, dollar amounts, and any peril-specific rules. - `discounts.json` — available discounts / surcharges, eligibility criteria, and the corresponding multiplicative factors. - `endorsements.json` — optional endorsements / riders attached to the filing. - `examples.json` — worked policyholder examples (sample insureds with calculated premiums). - `exclusions.json` — coverage exclusions and conditions under which they apply. - `extraction_summary.json` — structured machine-readable form of the same content `get_filing_summary` returns as Markdown; useful when you want filing-type / what-this-filing-does fields as JSON rather than prose. - `final_rating_calculation.json` — the canonical rating expression / equation the filing prescribes (base × factor1 × factor2 …). - `forms.json` — policy form numbers, edition dates, and the form types associated with the filing. - `rates_data.json` — the rate tables themselves: rows of (segment / cell / factor) values. **The biggest file by far** — can be hundreds of thousands of rows for territory-detailed filings. See truncation below. - `underwriting_guidelines.json` — eligibility and underwriting rules (e.g. credit-tier bands, prior-loss caps). **Truncation**: any returned file whose JSON contains an array longer than 100 rows is truncated to the first 100 rows. The truncated file gets a `_truncated` envelope describing the original total. For a lighter table-of-contents view (counts, item names, source pages — no payloads) call `get_filing_extract_meta` instead; it's the right surface for "what's in this filing" questions. `rates_data.json` is the common case where truncation fires. Args: `serff` (required), `files` (optional array — narrows the response to a subset of the whitelist; pass empty / omit for everything). Returns: `{ serff, files: { "<name>": <parsed json> | { content, _truncated } }, count, skipped, truncated }`.
- get_filing_extract_meta
Lists **what's in** each extracted artefact for a filing — section counts, item names, and the page each item came from — without returning any of the bulky factor tables, descriptions, or rate rows themselves. **Call this FIRST**, before `get_filing_extracts`, for any "what does this filing contain" question. It costs a fraction of the tokens and tells you which file + which section you need to pull in detail. `get_filing_extracts` is then the targeted second call once you know the SERFF + file + section that actually answer the user's question. Use this when the user asks: - "What forms does this filing include?" / "List the form numbers in TSIS-134726605." - "How many exclusions does it carry? What are they called?" - "What rate tables are in this filing, and which PDF page are they on?" - "List the discounts / endorsements / coverages this filing offers." - "Where in the source PDF is the territory rate table?" - Any "how many", "what are the names of", or "which page is X on" question about a filing's extracted artefacts. Wrong surface for: - Anything that needs the actual numeric content (factor values, full rate rows, full exclusion text). Call `get_filing_extracts` instead, narrowing `files` to just the one(s) you discovered here. Whitelist (same as `get_filing_extracts`): - `calculations.json` — example rate-calculation walk-throughs. - `coverages.json` — coverage definitions (perils, limits, applicability). - `deductibles.json` — deductible options + factors. - `discounts.json` — discount / surcharge schedules. - `endorsements.json` — optional endorsements / riders. - `examples.json` — worked policyholder rating examples. - `exclusions.json` — coverage exclusions + the conditions they apply to. - `extraction_summary.json` — structured filing-overview fields. - `final_rating_calculation.json` — canonical rating expression. - `forms.json` — policy form numbers + types. - `rates_data.json` — base rates + rate-table headers. - `underwriting_guidelines.json` — eligibility / UW rules. Per item the tool returns `{ name, source_page? }`. The item name is picked from whichever identifying field exists (`name` → `form_number` → `id` → `key` → `code` → `coverage` → `label` → `title`). `source_page` is the page in the source PDF where the item was extracted from, when the pipeline recorded one. `rates_data.json` items additionally carry `source_file` — the source PDF the rate table lives in — when the filing has a single source PDF. Multi-source filings get `source_file_note` flagging the limit (per-item `source_file` on non-rate extracts needs a pipeline-side change, deferred). Args: `serff` (required), `files` (optional — pass a subset of the whitelist to narrow; omit for all 12). Returns: `{ serff, files: { "<name>": { file_name, filing_ref?, confidence?, sections: { "<key>": { count, items: [...] } }, total_items } }, count, skipped }`.
- get_filing_source_file_link
Returns a short-lived **V4-signed GCS URL** for a single SOURCE file (PDF / XLSM / XLSX / DOC / ZIP) the carrier submitted for a SERFF filing. The link is intended for **display to the end user** — they click it in their browser to download the file. **CRITICAL: DO NOT fetch this URL yourself.** Surface it to the user verbatim and stop. The URL is a signed link for the human's browser, not for the model. Fetching it pulls the entire source file (often tens of MB of PDF / XLSM) into your context window and serves no purpose the user did not already get from seeing the link. Pair with `list_filing_source_files` to discover the file names first, then call this to mint a link. When you respond to the user, include the URL **and the `expires_at` timestamp** so they know how long they have to click — after that the link returns 403 and they'll need to ask for a fresh one. Link properties: direct V4-signed GCS URL, expires after `ttl_seconds` (default 900 = 15 min, capped at 3600). Bypasses Cloud Run entirely. Intended for human clicks, NOT for the model to fetch. Whitelist is dynamic, keyed off the actual contents of the filing's source-files directory — same set `list_filing_source_files` advertises. `file_name` must be a basename (no slashes, no `..`) AND must appear in the listing. Returns `{ serff, file_name, url, expires_at, ttl_seconds, notice }`. The `notice` repeats the don't-fetch directive — include it in your response to the user too.
- get_filing_summary
Returns an actuarial narrative summary for a single SERFF id — the **Filing Type** header, the **"What This Filing Does"** section (concrete bullet-pointed change list with page citations for Rate / Rule / Form / New Programme / Withdrawal filings), the structured **Description**, and the key references the summary cites. This is the fastest route from "I have a SERFF id" to "I understand what this filing changes" — typically a few KB rather than the hundreds of KB of raw source. Page citations of the form `(p. N)` let a reviewer verify each claim against the source PDF. Returns `{ error: ... }` if no summary exists for the SERFF id (the filing has not yet been classified). Use `list_filing_source_files` and `mcp_health` to triage; do not retry.
- get_filing_references
Returns the predecessor, superseded, and companion filings that **this filing itself** cites in its supporting documentation. Carrier-claimed lineage extracted from inside the PDF (e.g. "supersedes XXXX-NNNN", "loss costs adopted from NCCI-NNNN"). Distinct from `get_filing_lineage`, which returns the reconciled chain across the corpus. The two often agree but can diverge — `get_filing_references` is the carrier's stated lineage; `get_filing_lineage` is what was actually wired together across filings. When they disagree, that is itself a signal worth surfacing. Each entry typically carries a SERFF id, NAIC, group code, filing type, and a relationship label (predecessor / superseded / loss-cost-source). Use to answer "what does this filing claim to replace?" or "which bureau filing did this carrier adopt?". Returns `{ error: ... }` if no references record exists for the SERFF id (the filing has not yet been classified).
- url2Pdf
Convert a URL to PDF
- LP_Get_Elevation_Chart
Generate a range-box chart showing elevation Min/Avg/Max across three neighbourhood window sizes. Returns a URL to the chart image. Requires Pro key. Supports PNG / SVG / PDF.
- LP_Get_Slope_Chart
Generate a range-box chart showing terrain slope Min/Avg/Max across three neighbourhood window sizes. Returns a URL to the chart image. Requires Pro key. Supports PNG / SVG / PDF.
- search_arxiv
Search arXiv preprints by keyword or category. Returns title, abstract, authors, and PDF link. Best for AI, CS, physics, and biology research.
- search_servers
Search the MCP Marketplace catalog. With a free-text `query` and default `sort`, results are ranked by semantic similarity (gte-small embeddings + cosine similarity), so natural-language queries like 'manage my calendar', 'something to read PDFs', or 'database for my agent' work as well as keyword searches. Each result includes `security_score` (0-10), `risk_level` (low/moderate/high/critical), `critical_findings` (count of severity=critical|high findings), pricing, rating, install count, and a URL. `ranking_mode` in the response indicates whether semantic or keyword matching was used. Before recommending an install, call get_server for full details including every flagged finding — critical_findings > 0 means the server has known security issues you must surface to the user.
- get_ttab_document
Retrieve and read one specific TTABVUE filing by proceeding number and entry number. Returns filing metadata, a working USPTO TTABVUE viewer link, direct PDF link when available, extraction/readability status, document text, and optional query-centered excerpts. Use get_ttab_proceeding_details first when the entry number is unknown.
- search_literature
Search scientific literature and read full-text content from peer-reviewed papers. Use `dois` (preferred) or `titles` with targeted `term` queries to extract full-text passages from specific papers. Each call returns up to 5 relevant excerpts (~500 chars each) — vary search terms across calls to read through a paper section by section. **IMPORTANT — keep `limit` small.** Use `limit: 10-50` with `offset` for pagination. Large limits with full citations and excerpts produce very large payloads that consume significant LLM context. **Calling with no parameters browses the corpus** (210M+ papers, relevance-sorted). This is allowed for broad exploration but rarely what you want — pass `term`, `dois`, `titles`, or other filters for targeted results. **What This Tool Returns:** - Paper metadata: title, authors (first 3), abstract, DOI, journal, year, volume, issue, page - `fulltextExcerpts`: up to 5 passages (~500 chars) from the paper matching your query (OA only) - `access`: resolved access link with source, type (open/institutional/purchase), content type, and pricing - `citations`: Smart Citation statements — actual quoted text from citing papers, classified as supporting/contrasting/mentioning/unclassified (unclassified = statement present but classifier hasn't assigned a type) - `tally`: citation metrics (total, supporting, contrasting, mentioning, citing publications) - `editorialNotices`: editorial notices (retraction, correction, concern, erratum), each with status, noticeDoi, date - `isOa`, `oaStatus`, `license`: open access information **Fetching Paper Metadata (no search term needed):** Pass `dois` or `titles` WITHOUT a `term` to retrieve metadata for specific papers. Example: `dois: ["10.1038/s41586-020-2012-7"]` **Full-Text Excerpts:** For OA papers, `fulltextExcerpts` contains passages matching your query. If empty, the full text is not indexed or terms didn't match — use the `access` field for the best link to the PDF or full text. **Smart Citations ARE Full-Text Evidence:** - `snippet`: exact sentence/paragraph from the citing paper's full text - `type`: classification (supporting, contrasting, mentioning, unclassified) - `section`: paper section (Introduction, Methods, Results, Discussion) - `sourceDoi`: paper containing this snippet; `targetDoi`: paper being cited **Search Capabilities:** - Boolean operators: AND, OR, NOT - Phrase search: "exact phrase" - Proximity: "term1 term2"~5 - Field filters: title, abstract, author, journal, year, affiliation - Citation filters: supporting_from/to, contrasting_from/to, mentioning_from/to - Editorial filters: has_retraction, has_concern, has_correction, has_erratum **Parameters:** - `term`: cross-field search query (optional when `dois`/`titles` provided) - `dois`: array of DOIs to filter to specific papers - `titles`: array of titles to filter (use when DOIs unavailable) - `limit`: max results (default: 10, max: 1000) - `offset`: pagination offset - Plus 20+ filter parameters (see schema) **Response Format:** ```json { "hits": [{ "doi": "10.1234/example", "title": "Paper Title", "authors": [{"authorName": "Jane Smith"}], "abstract": "Full abstract text...", "year": 2023, "journal": "Nature", "tally": {"supporting": 32, "contrasting": 8, "mentioning": 5}, "fulltextExcerpts": ["Relevant passage..."], "access": {"url": "https://...", "accessType": "open", "contentType": "pdf"}, "citations": [{"snippet": "These findings...", "type": "supporting", "section": "Results"}], "editorialNotices": [{"status": "retracted", "noticeDoi": "10.1234/notice", "date": "2021"}] }] } ```
- search_510k_summaries
Search the full text of FDA 510(k) summary PDF documents. This dataset contains OCR'd full-text content from FDA 510(k) premarket notification summary PDFs. Unlike `search_device510k` which returns structured clearance metadata (device class, applicant, decision codes), this tool searches the actual narrative text of 510(k) submissions and returns matching page-level snippets. Use this tool when the question involves the *content* of a 510(k) submission rather than its metadata. Common triggers: test results, performance data, biocompatibility, substantial equivalence comparisons, indications for use, predicate device comparisons, sterilization methods, software descriptions, bench testing, or clinical study summaries. When you already have a K number from `search_device510k`, use `get_510k_summary` to read the full document instead of searching again. **Parameters:** - q: Search query (technical terms, device descriptions, test methods, etc.) - f: Space-delimited filters in `field:"value"` format - p: Page number (default: 1) **Returns:** Documents with id, filename, tags, and page-level content snippets showing where the query matched within each 510(k) summary PDF.
- get_510k_summary
Fetch the full text of a single FDA 510(k) summary PDF by document ID. Use this after `search_510k_summaries` or `search_device510k` when you need the complete narrative text of a 510(k) summary, not just search snippets or structured metadata. Returns the full extracted text organized by page. **Parameters:** - id: Document identifier (the K number, e.g. `K192757`). Can be obtained from either `search_510k_summaries` or `search_device510k` results. **Returns:** The full-text content of the 510(k) summary PDF, organized by page, with file metadata and ontology tags.