← Files Distilla Investment ResearchARCHIVED FILE
chatgpt-app-submission.json
14.1 KB · Oct 5, 2026 · 18:29 UTC
{
"$schema": "https://developers.openai.com/apps-sdk/schemas/chatgpt-app-submission.v1.json",
"schema_version": 1,
"app_info": {
"display_name": "Distilla",
"subtitle": "Financial and equity research",
"description": "Distilla brings financial analysis and fundamental equity research to your AI assistant. Look up public-company fundamentals (financial statement line items and ratios), analyst consensus estimates, earnings dates, earnings filings and call transcripts, daily stock prices, and valuation multiples such as P/E and EV/EBITDA. See explanations for significant stock price moves, compare competitive peers by sector and product category, and run qualitative stock screens on business drivers or earnings-call commentary across selected companies or regions. Search Distilla's Public Library of research documents and investing podcasts, with source details. A Distilla account is required. Screen requests create jobs that may take time to complete; other research calls also count against account usage.",
"category": "FINANCE"
},
"tools": {
"ping": {
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
},
"justifications": {
"read_only_justification": "Returns 'pong' with the supplied message. It neither changes account data nor creates a usage record.",
"open_world_justification": "Checks only this Distilla MCP server; it does not browse the public internet or access open-ended external entities.",
"destructive_justification": "It does not delete, overwrite, send, or alter data."
}
},
"list_queryable_entities": {
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
},
"justifications": {
"read_only_justification": "Returns the allowed Distilla entity catalog. The server meters the call against the account's usage quota for billing; this does not change any research, account, or user-visible data.",
"open_world_justification": "Reads a bounded Distilla entity catalog, not the public internet or arbitrary external sources.",
"destructive_justification": "The usage record does not delete or overwrite research or account content."
}
},
"describe_queryable_entities": {
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
},
"justifications": {
"read_only_justification": "Returns schemas for the named allowed entities. The server meters the call against the account's usage quota for billing; this does not change any research, account, or user-visible data.",
"open_world_justification": "Looks up schemas only in Distilla's bounded queryable entity registry.",
"destructive_justification": "It does not delete or overwrite entity definitions or user content."
}
},
"query_entity": {
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
},
"justifications": {
"read_only_justification": "Returns one page of rows from an allowed Distilla entity. The server meters the call against the account's usage quota for billing; this does not change any research, account, or user-visible data.",
"open_world_justification": "Queries Distilla's allowlisted financial data entities rather than the public internet or arbitrary external systems.",
"destructive_justification": "The query does not update or remove entity rows or user research."
}
},
"aggregate_entity": {
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
},
"justifications": {
"read_only_justification": "Returns one page of aggregate groups from an allowed Distilla entity. The server meters the call against the account's usage quota for billing; this does not change any research, account, or user-visible data.",
"open_world_justification": "Aggregates Distilla's allowlisted financial data entities, a bounded data source.",
"destructive_justification": "It does not delete or overwrite the underlying data or saved user research."
}
},
"screen_drivers": {
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
},
"justifications": {
"read_only_justification": "Creates a user-scoped screen job in cloud storage, queues a background task to score company driver profiles, and consumes and records account usage.",
"open_world_justification": "Scores Distilla's bounded company driver corpus through its configured service; it does not browse arbitrary websites or contact user-selected recipients.",
"destructive_justification": "It creates a new job and result without deleting or overwriting existing research or account data."
}
},
"screen_earnings": {
"annotations": {
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
},
"justifications": {
"read_only_justification": "Creates a user-scoped screen job in cloud storage, queues a background task to score earnings material, and consumes and records account usage.",
"open_world_justification": "Screens Distilla's bounded earnings corpus through its configured service, not the public internet or arbitrary external entities.",
"destructive_justification": "It creates a new job and result without deleting or overwriting existing research or account data."
}
},
"get_screen_job": {
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
},
"justifications": {
"read_only_justification": "Reads the status and result of a screen job owned by the signed-in user; polling does not rerun or modify the job. The server meters the call against the account's usage quota for billing; this does not change any research, account, or user-visible data.",
"open_world_justification": "Reads only a user-scoped Distilla screen job, a bounded private account resource.",
"destructive_justification": "Polling does not rerun, delete, or overwrite the job or its result."
}
},
"search_public_library": {
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
},
"justifications": {
"read_only_justification": "Searches Distilla's Public Library and returns an answer with a source list. The server meters the call against the account's usage quota for billing; this does not change any research, account, or user-visible data.",
"open_world_justification": "Search is restricted to Distilla's Public Library corpus, with optional document and ticker filters; it is not open web search.",
"destructive_justification": "It returns an answer and source list without altering library documents or user content."
}
},
"get_library_document": {
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
},
"justifications": {
"read_only_justification": "Returns one available Public Library document's metadata, summary, and tags, plus text where permitted. The server meters the call against the account's usage quota for billing; this does not change any research, account, or user-visible data.",
"open_world_justification": "The document must belong to Distilla's available Public Library; arbitrary URLs and private uploads cannot be read.",
"destructive_justification": "It does not delete or overwrite the document or other account data."
}
}
},
"test_cases": [
{
"description": "Summarize recorded stock price moves and their explanations through schema-guided entity queries. Requires a demo account with company and price explanation data.",
"user_prompt": "Summarize NVIDIA's price moves with Distilla and reasons over the last 3 months and establish patterns.",
"tools_triggered": "list_queryable_entities, describe_queryable_entities, query_entity",
"expected_output": "Provide a chronological summary of returned NVIDIA price-explanation rows dated within the three months before the request, including the recorded moves and their stated explanations. Identify repeated themes only when supported by multiple rows. If no rows match or the page is truncated, say so. Present the explanations as Distilla-reported and do not add unsupported causal claims."
},
{
"description": "Aggregate company records by sector using the entity schema. Requires a demo account with company and sector data.",
"user_prompt": "Count US-headquartered companies by sector in Distilla, show the 15 largest groups, and tell me whether the results are truncated.",
"tools_triggered": "list_queryable_entities, describe_queryable_entities, aggregate_entity",
"expected_output": "Return up to 15 sector names with company counts for records matching hq_country = US, ordered by count descending. Each displayed name and count must match the aggregate rows after resolving the returned sector IDs to names; equal counts may appear in either order. Report the aggregate's truncation status. If it is truncated, either disclose that the counts cover only the returned page or retrieve enough groups to establish the complete aggregation; state whether the final grouping is complete and do not treat a capped page as exhaustive. Describe the population as records matching the schema’s US filter; the schema labels US as ‘US-listed companies,’ so do not claim a stricter headquarters definition than the data supports."
},
{
"description": "Screen a fixed set of three named companies for a qualitative driver match and poll the resulting job. Requires a demo account entitled to screening with screen jobs enabled.",
"user_prompt": "Screen Microsoft (MSFT), Broadcom (AVGO), and NVIDIA (NVDA) using their company-driver profiles to identify documented links between growth and AI hyperscaler capital spending. Show each returned screen score and supporting driver, include coverage, and treat equal scores as ties.",
"tools_triggered": "list_queryable_entities, describe_queryable_entities, query_entity, screen_drivers, get_screen_job",
"expected_output": "Return the matching companies from the named three-company set, ordered by match score, with each returned score and its supporting driver. Treat equal scores as a tie; do not imply a unique strongest company unless the returned scores distinguish one. Include coverage for this set and whether all three companies were evaluated. If the result summary and coverage totals disagree, report both and flag the discrepancy; do not reconcile them or imply a broader screen. Report results only after the screen finishes, or report its error if it fails."
},
{
"description": "Compare one recent Public Library podcast about hyperscaler AI data-center financing with recent same-topic sell-side research. Requires a demo account with Public Library access and matching podcast and research documents.",
"user_prompt": "Find the latest Public Library podcast about hyperscaler AI data-center financing. Compare its guest's view with recent Distilla research on the same financing risks, and say whether the sources directly conflict or describe cautionary tension.",
"tools_triggered": "search_public_library, get_library_document",
"expected_output": "Identify the latest retrieved Public Library Podcast about hyperscaler AI data-center financing, with its title and publication date, then inspect the returned podcast document. Compare the guest's stated view only with retrieved recent Research documents addressing the same financing risks. Distinguish directly opposing conclusions from cautionary tension or reinforcing concerns; do not claim a conflict unless the sources support opposite conclusions. Treat the returned documents as a sample, not exhaustive consensus, and say if no comparable research is returned."
},
{
"description": "Search the bounded Public Library and inspect one returned document. Requires a demo account with Public Library access and at least one matching document.",
"user_prompt": "Find recent Public Library research about NVIDIA AI data-center demand. Summarize the common points and show the summary and tags for one source document.",
"tools_triggered": "search_public_library, get_library_document",
"expected_output": "Provide a sourced synthesis of returned Public Library results about NVIDIA AI data-center demand, identify the sources, and show metadata, summary, and tags for one returned source document. Make clear the synthesis reflects retrieved sources, not exhaustive consensus. Research documents omit full text; say if no matching source exists."
}
],
"negative_test_cases": [
{
"description": "Unrelated messaging request; no Distilla tool can send messages.",
"user_prompt": "Send an email to my team with today's meeting notes.",
"tools_triggered": null,
"expected_output": "Do not call Distilla tools or claim to send an email. Explain that the app provides equity research data, not email delivery."
},
{
"description": "Private document request; the MCP library tools only expose available Public Library documents.",
"user_prompt": "Open the private research report I uploaded to Distilla yesterday and paste its full text here.",
"tools_triggered": null,
"expected_output": "Do not attempt to retrieve a private upload with Public Library tools. State that this app cannot access private uploads, and ask for a public document reference or a user-provided file if appropriate."
},
{
"description": "Unsupported trading action; all exposed tools are research and screening tools.",
"user_prompt": "Buy 100 shares of NVIDIA in my brokerage account now.",
"tools_triggered": null,
"expected_output": "Do not call Distilla tools or claim to place an order. State that the app cannot execute trades."
}
]
}
SHA-256: 251283ea2267d783ef5127f8f87606410cf4dd3fa8e60b46dbd8f13b9e4ebf5a