add_companies_to_list
ChatGPTAdd companies to an existing company list. Uses standard company IDs from company search or existing company rows. REQUIRES POLLING: call get_lists or get_companies with company_filters.list_id after waiting.
add_customer_story
ChatGPTAdd one live customer story. Call get_config(requested_field='customer_stories') first when you need to inspect existing story labels and avoid duplicates.
add_people_to_list
ChatGPTAdd existing org people to a people list.
approve_proposal
ChatGPTApprove a proposal so Meticulate can send it. Use edit_proposal first if the user asked to change the proposal before approval. This approves one sequence and may nullify superseded sequences for the same person, matching app behavior.
create_calibration_session
ChatGPTCreate a Calibration Studio session. Use get_options first when you need IDs for the owner, sequence format, ruleset, style, event play, or context play. Choose focus.type based on what the user wants to work on: core_configs for company targeting, person targeting, or messaging setup; build_style for drafting style changes; event_play for event-based messaging; context_play for reusable messaging ideas. Use send_calibration_chat_message for AI-assisted edits after creation. For core_configs, enable at least one of company_targeting, person_targeting, or messaging. REQUIRES POLLING wait_for_calibration_session when session_mode is simulate_current_setup.
create_company_list
ChatGPTCreate a company list. std_co_ids are optional. When provided, companies are added through the same background path as the app. REQUIRES POLLING when std_co_ids is non-empty: call get_lists or get_companies with company_filters.list_id after waiting.
create_people_list
ChatGPTCreate a people list and optionally add existing org people.
create_topics
ChatGPTCreate new topic definitions for the organization. IMPORTANT: Before creating topics, call list_topics first to check if a matching topic already exists. Reuse existing topic IDs instead of creating duplicates. Topics are custom research questions that get answered for each company using AI analysis of public data. Each topic requires: - display_name (str): human-readable name for the topic - instructions (dict): defines the question and output format. Must include a 'format' key set to one of the formats below, plus format-specific fields: score: Rate companies 0-5 on a question. - question (str, required): the scoring question - guidance (str, optional): extra context for the scorer - rubric (dict, optional): keys 'zero' through 'five', each a string describing what that score means. Each level should be specific enough that two independent reviewers would assign the same score. number: Estimate a numeric value (e.g. location count, revenue). - stat_to_estimate (str, required): what number to estimate. Include the unit when values span wide ranges (e.g. "Annual revenue in millions of USD"). - guidance (str, required): how to estimate it — what sources to check, what proxies to use - integers_only (bool, optional, default false) singleselect: Classify into one mutually exclusive category. - question (str, required): the classification question. Frame as "Does this company do X?" for targeted detection rather than "What does this company do?" for better accuracy on large companies. - options (list, required): each {id: str, label: str, description?: str}. Each option's description (10-15 words) should specify observable signals that differentiate it from other options. - allow_none_of_the_above (bool, required): set true if companies might not fit any option multiselect: Tag with one or more non-exclusive labels. - question (str, required): the classification question - options (list, required): each {id: str, label: str, description?: str}. Descriptions should clarify what evidence qualifies a company. text_output: Free-text answer for open-ended research. - question (str, required): the question to answer - example_format (str, optional): example of the desired answer format, showing structure and level of detail expected Optional fields (defaults provided if omitted): - info_to_use: dict specifying what data sources the AI uses to answer. Keys: topic_ids (list[str]): other topic IDs whose answers to include as context. Use sparingly — each dependency adds recomputation cost. standard_elements (list[str]): data sources to feed in. Pick 1-4 that are relevant to the question: - 'basic_firmographics': company size, funding, location, industry, business model, offerings, customer segments. Sufficient for most classification questions. - 'tech_detections': technologies the company uses - 'job_listings': current job postings - 'employee_roles': employee titles and departments - 'sec_reports_transcripts': SEC filings and earnings calls - 'co_linkedin_posts': company LinkedIn activity - 'new_joiners': recent hires - 'landing_page': company website content, product positioning. Add only when the topic needs detail beyond basic_firmographics. websearch_volume (int): number of web searches to run (0 = none). Reserve for topics that need recent news, partnerships, or events. Defaults to empty (basic firmographic info only). - run_conditions: dict controlling when the topic is generated. Defaults to {generate_when_requested: true}. Returns the list of newly created topics with their assigned IDs.
edit_proposal
ChatGPTEdit a proposal sequence. First call get_proposals with requested_fields=['steps'] to get step IDs. Pass only the fields to change. message edits email bodies or LinkedIn text; subject edits email subjects; guidance edits phone call guidance. This saves the proposal but does not approve it.
find_people
ChatGPTFind prospects at selected companies and match them to org-defined persona fits. Use this after get_companies, get_company_searches, or a company list gives you standard company IDs. Pass org_personas_to_find when the user asks to find existing target personas, persona fits, buyers, prospects, or the right people at a company. Use custom_persona_to_find only when the user gives a new freeform persona that is not one of the org's configured personas. Do not invent a custom_persona_to_find for broad requests like "persona fits" or "decision-makers"; use the org's configured personas. If the user seems to want a custom profile but has not specified it clearly, ask them to confirm the custom persona before running. Add found people to exactly one destination: either an existing people list via people_list_id, or a new people list via people_list_title. REQUIRES POLLING: call get_people with person_filters.list_id or get_lists(type='person') using the returned people_list_id.
find_similar_companies
ChatGPTFind companies similar to a given company using vector similarity. Takes a reference company's standard ID (from recognize_companies or search_companies) and finds companies with similar semantic profiles (business model, offerings) via embedding similarity. Important: results get broader/noisier at higher volumes. At limit=20 you get close matches; at limit=100+ you'll see adjacent-market companies that share some overlap but aren't direct competitors. For large competitor lists, combine this with search_companies using a specific description of the reference company's niche for better precision. The reference company itself may appear in results — filter it out if needed. Filter fields (all optional) narrow the results: - employee_min/employee_max, year_founded_min/year_founded_max - hq_country (list of 2-letter ISO country codes, e.g. ['US']) - ownership_types, estimated_revenue_min/estimated_revenue_max - limit: max results (default 20, max 500) Returns a list of standard company IDs (UUIDs as strings). Use get_basic_company_info to fetch details for these IDs.
get_basic_company_info
ChatGPTGet basic firmographic information for a list of companies by their IDs. Takes standard company IDs (UUIDs as strings) from recognize_companies, search_companies, or find_similar_companies. Pass all IDs in a single call — the tool handles batching internally and is more efficient than multiple separate calls. Returns company data including: - name, domain, company_type (private/public) - employee_guess, employee_min, employee_max, employee_count_90day_growth - revenue_min, revenue_max (USD) - year_founded - hq_country, hq_region, hq_metro - linkedin_followers, linkedin_followers_90day_growth - tags (industry/vertical labels) - web_traffic, hype_rating, product_score Use this for quick lookups, comparisons, and filtering. For custom analytical questions not covered by these fields, use create_topics and run_topics_on_companies instead. Returns null for company IDs not found.
get_calibration_session
ChatGPTRead one Calibration Session. For readiness/review questions, prefer review_calibration_session. Use get_calibration_session when you need one specific piece of a session: status/latest_runs for progress and latest result pointers; messages/chat_history for the visible session conversation; working_config/base_config/diff with runbook for one editable config area; working_config_search with query to find text in working configs; simulation_results with surface for one paginated simulation-result set; calibration_summary only when the full summary text is needed. Broad working_configs/base_configs are supported, but can be large. Avoid broad combined reads for normal review workflows. For simulation_results, pass surface to choose company_targeting, person_targeting, or messaging. Use limit and offset to page through simulation result entries; those pagination parameters only apply to simulation_results. Pass run_id only when inspecting a specific run instead of the latest run for that surface.
get_calibrations
ChatGPTDiscover recent Calibration Sessions. Use this first for recent/latest/most relevant calibration sessions, then call get_calibration_session with the chosen session_id for details. requested_fields can include calibration_summary and run_summaries. Enriched calibration-list requests are capped at limit <= 3.
get_companies
ChatGPTRead companies in an org. requested_fields can include standard_company, company_info, people, signals, exclusion, notes, heat_score, detailed_topic_answers, targeting_qa, account_research, and people_finding. Default rows are designed for broad targeting review: company identity, min-criteria status, targeting state, overview.icps, lightweight firmographics, and overview.topic_answers with one compact value per configured company topic. Use requested_fields=["targeting_qa"] when you need fit/non-fit reasons, ICP pass/fail details, and min-criteria context. Requested fields add nested sections and capped evidence. Heavy enriched company requests are capped at limit <= 3. Use company_filters to narrow by CRM, ICP/min-criteria, lists, owners, prospecting state, exclusions, company IDs, names, or topic answers. Omit it when no filtering is needed. count is the total matched row count; pagination.returned_count is the number of rows returned on this page. Default sorting prioritizes companies that look more outbound-ready over alphabetical edge cases.
get_company_searches
ChatGPTRead saved Company Searcher searches and optionally include result pages. Without results, each search is returned as metadata with no result count. With results, count_accuracy indicates whether the count is exact, estimated, or capped.
get_config
ChatGPTRead one area of an org's configuration. Choose exactly one requested_field per call: enterprise, company_targeting, person_targeting, rulesets, styles, guidance_notes, customer_stories, or calibration. Use compact detail for review/audit questions. Use full detail only when the user needs the complete text or structured body for that one area. The enterprise field returns org/business and operational settings. company_targeting returns min criteria, company topics, ICPs, and company search recommendations. person_targeting returns personas, person topics, and person targeting filters. The customer_stories field returns live customer-story collateral. The calibration field returns the org-level calibration summary and log. Full rulesets/styles can be long, so their blocks are paged per item with block_offset and block_limit. Start with block_offset=0 and continue while any returned item has has_more_blocks=true.
get_interactions
ChatGPTRead sent and received prospect interactions. Use this for recent outbound activity, replies, prior touches, event/context-play usage, and account history. Returns subject/body previews and guidance-note labels when available. By default this only returns interactions associated with Meticulate prospecting. Set include_unassociated=true only when explicitly debugging raw CRM/mailbox records outside Meticulate workflows.
get_lists
ChatGPTRead person or company lists for an org. Use limit and offset for pagination.
get_options
ChatGPTRead lightweight setup options. Use this when you need IDs or labels for owners, sequence formats, rulesets, styles, event plays, context plays, locations, CRM owners, or outbounding accounts. Returns lightweight details only. Use get_config when you need full ruleset, style, event play, or context play details.
get_people
ChatGPTRead people in an org. Default rows include the person's core profile/contact fields. requested_fields can add company_info, interactions, signals, current_sequence, proposal, outbounding_plan, exclusion, notes, persona_fit, topic_answers, and guidance_notes. Requested fields add compact nested sections and capped evidence; enriched people requests are capped at limit <= 5. Use person_filters and company_filters to narrow by CRM, lists, owners, personas, titles, location, contact data, prospecting state, heat score, exclusions, ICP/min-criteria, or topic answers. Omit filters when no filtering is needed. count is the total matched row count; pagination.returned_count is the number of rows returned on this page.
get_product_doc
ChatGPTRead one product detail doc by slug. Use when the Overview names a relevant detail slug and more detail is needed for guidance. If the slug is unknown, this returns the valid detail slugs.
get_product_links
ChatGPTRead the app Links doc. Use when the user asks where to open something in Meticulate, how to navigate to a page, or when the answer should include an app URL.
get_product_overview
ChatGPTRead the product Overview doc. Call this before answering user questions to decide how Meticulate can help with the user's goal. Use the Overview to route the answer through the relevant Meticulate workflow, page, config, org data, or tool. If more detail is needed about a specific product area, call get_product_doc with the relevant slug from the Overview before answering.
get_product_qa_examples
ChatGPTRead example product questions and answers. Use this after the product Overview when the user needs guidance, explanation, interpretation, or help choosing how to use Meticulate. Skip it for straightforward requests that only require reading or changing clearly identified org data.
get_proposals
ChatGPTRead proposal/action sequences. Use this for pending proposals, approved sequences, queued sequences, active drafting, aborted, or nullified sequences. status='drafting' includes both queued and in-progress drafting; status='queued' and status='in_progress_drafting' split them apart. sequence_ids reads exact sequences and is the polling surface for proposal redrafts; omit status when polling exact sequence_ids unless the user asked for a specific status. Filter by guidance_note_ids for event/context-play usage. Date filters apply to time_queued, time_finished_drafting, or approved_at. requested_fields can include steps and warnings; when present, full records are returned in sequences in addition to compact objects. Use person_filters and company_filters to narrow by people/company properties. list_id is a shortcut for filtering to one people list. Enriched proposal requests are capped at limit <= 25.
get_topic_answers
ChatGPTGet topic answer results for companies. Takes a list of standard company IDs and topic IDs (UUIDs as strings). Returns only answers for the specified topics. Returns: - overall_status: 'complete' or 'computing' - results: list of per-company results, each with: - company_id: the requested company ID - topic_answers: list of {topic_id, value, computing_status, format} - next_step (only when computing): instructions to sleep then retry If overall_status is 'computing', follow the next_step instructions: run the sleep script in Code Interpreter, then call this tool again with the same parameters. Keep repeating until complete — do NOT stop unless the user tells you to.
list_topics
ChatGPTList all topic definitions for the organization. Returns a list of topics, each with id, display_name, format, and instructions. Topics define custom research questions that can be run on companies.
recognize_companies
ChatGPTIdentify and normalize companies from names, websites, or LinkedIn URLs. Use this as the first step when you have company names or URLs and need to resolve them to standard IDs for use with other tools. Each item in the list should have at least one of: name, website, linkedin_url. Optionally include 'description' to improve matching accuracy when only a name is provided. Returns a list of results, each containing: - recognized_id: the standard company UUID (or null if not found) - recognized_domain: the company's primary domain (or null) - recognition_type: EXACT_MATCH, REDIRECT, DIFFERENT_DOMAIN, NOT_FOUND, etc. The recognized_id can then be passed to get_basic_company_info, find_similar_companies, or run_topics_on_companies.
remove_companies_from_list
ChatGPTRemove companies from a company list.
remove_customer_story
ChatGPTRemove one live customer story. Target exactly one story by story_label or zero-based story_index. Call get_config(requested_field='customer_stories') first when you need current labels or indexes.
remove_people_from_list
ChatGPTRemove people from a people list.
rename_company_list
ChatGPTRename a company list.
rename_company_search
ChatGPTRename a saved Company Searcher search without changing its filters.
rename_people_list
ChatGPTRename a people list.
request_proposal_redraft
ChatGPTRequest AI redrafts for proposal sequences. This creates replacement proposal drafts and immediately nullifies existing unapproved proposals for the selected people. Pass sequence_ids for exact proposals when available. Otherwise pass universe_person_ids to redraft each person's current pending proposal. REQUIRES POLLING: call get_proposals with sequence_ids from this response.
review_calibration_session
ChatGPTReview whether a Calibration Session is ready to make live. Use this for analyst-style Calibration Studio review. It returns a compact bundle for each requested surface: session status, dirty/made-live state, working-copy diff summary, latest simulation pointer, metrics, stale/no-entry warnings, and failed examples with denormalized subject details. Prefer this over broad working_configs/base_configs/ simulation_results when the user asks what changed, whether tests improved, what still fails, or whether the session is ready to make live. surfaces defaults to company_targeting, person_targeting, and messaging.
run_calibration_simulation
ChatGPTRun tests/simulations for the current Calibration Session. Use this when the user asks to simulate, run tests, or validate the current session without asking for another edit. After this returns, call wait_for_calibration_session before judging results. If the session is still running, call wait_for_calibration_session again; try at least 3 waits before giving up unless the user asked not to wait.
run_topics_on_companies
ChatGPTRun specific topics on companies. Processing happens asynchronously and can take 30-120 seconds per company depending on topic count and data sources. Args: - company_ids: list of standard company UUIDs as strings (from recognize_companies, search_companies, or find_similar_companies) - topic_ids: list of topic UUIDs as strings (from list_topics or create_topics) IMPORTANT: Always call list_topics first to get existing topic IDs. Only call create_topics if no existing topic matches the question. Companies are automatically added to the organization's universe if not already present. Immediately marks the requested topic answers as "computing" in the database and returns. The actual computation runs in the background. IMPORTANT: After this returns, follow the next_step instructions in the response. You must run the sleep script in Code Interpreter, then poll get_topic_answers. Keep repeating until overall_status is 'complete'. Do NOT stop unless the user tells you to. Returns: - results: per-company status ('initiated' or 'invalid_company_id') - next_step: instructions for polling (includes sleep script and parameters)
search_companies
ChatGPTSearch for companies by semantic description and/or filters. Use this to discover companies in a market or industry. Combines semantic similarity search (what the company does) with firmographic filters. Semantic search fields (at least core_business is required): - core_business: what the company does, its industry or market (required) - main_offerings: specific products, services, or solutions they provide - customers: who they sell to — industries, segments, or buyer types - tech_innovations: technologies they build or use Be specific with semantic fields for better results. For example, "cloud GPU infrastructure for AI model training" is much better than "technology company". Filter fields (all optional): - employee_min/employee_max: employee count range - year_founded_min/year_founded_max: founding year range - hq_country: list of 2-letter ISO country codes (e.g. ['US'], ['US', 'CA', 'GB']) - ownership_types: list of company types (e.g. 'private', 'public') - estimated_revenue_min/estimated_revenue_max: revenue range in USD - limit: max results (default 20, max 500) Returns a list of standard company IDs (UUIDs as strings). Use get_basic_company_info to fetch details for these IDs.
send_calibration_chat_message
ChatGPTSend a message to a Calibration Session's AI assistant. This submits chat or edit work and returns before the assistant finishes. send_mode controls behavior: chat asks a question, edit_only asks for an edit without tests, and edit_and_test asks for an edit followed by tests. To test current changes without another edit, use run_calibration_simulation. After this returns, call wait_for_calibration_session before judging results. If the session is still running, call wait_for_calibration_session again; try at least 3 waits before giving up unless the user asked not to wait.
start_company_search
ChatGPTCreate a saved Company Searcher search and return its first result page. Use input_type='description' for natural-language criteria or input_type='similar_company' for a domain. Results are immediately available; use get_company_searches to reopen the saved search later.
update_calibration_working_config
ChatGPTReplace one editable working-config slice in a calibration session. runbook can be ctr, ptr, ruleset/prr, style/psr, guidance_notes, customer_stories, mrr, or messaging_concepts. The payload must be the full replacement object/list for that slice, not a patch or natural-language edit request. Prefer send_calibration_chat_message for AI-assisted edits. The tool validates the payload, applies the same edit-mode and session ownership gates as Calibration Studio, updates dirty_runbooks, and returns the updated slice plus a compact top-level diff.
update_customer_story
ChatGPTUpdate one live customer story. Target exactly one story by story_label or zero-based story_index. This edits live customer-story collateral only; use Calibration Studio for broader messaging or targeting changes. Call get_config(requested_field='customer_stories') first when you need current labels, indexes, or contents.
update_org_calibration_summary
ChatGPTWrite the org-level calibration summary for an org. This updates only calibration_configs.calibration_summary for the resolved org. It does not update any specific Calibration Session and must not be used for any other config fields.
wait_for_calibration_session
ChatGPTWait briefly for Calibration Session work to finish. Use after send_calibration_chat_message or run_calibration_simulation. It returns when the session is no longer busy or when max_wait_seconds elapses. If is_terminal=false, call this tool again; try at least 3 waits before giving up unless the user asked not to wait. If you stop waiting while the session is still running, explicitly tell the user to ask again in a bit for the result after the session finishes.