feat(mcp): add idx-mcp, a stdio MCP server over idx-core

Phase 4 of docs/DESIGN.md. Eleven grouped tools (quotes, history, screen,
company, analysis, compare, shareholders, investor holdings, search,
ownership changes, status); ownership_sync is listed only with
--allow-sync. Live results keep the Fetched envelope, errors use the CLI's
{error, code, message} body, and investor tools on an empty database
point at the sync path.

idx-core gains Period/Interval FromStr, Investor::status, a ticker
filter on changes, and Display for ErrorCode (now used by the CLI too).
CLI output and goldens are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
hermes 2026-10-14 18:19:04 +00:00
commit cda12fe2db
18 changed files with 1546 additions and 38 deletions

View file

@ -601,7 +601,7 @@ fn handle_changes(
args: &ChangesArgs,
config: &IdxConfig,
) -> Result<(), IdxError> {
let changes = investor.changes(&args.from, &args.to)?;
let changes = investor.changes(&args.from, &args.to, None)?;
if config.output.is_json() {
return json::print_json(&changes);

View file

@ -215,7 +215,7 @@ pub fn emit_error(err: &IdxError, format: &OutputFormat) {
}
let payload = serde_json::json!({
"error": true,
"code": format!("{:?}", err.code()).to_uppercase(),
"code": err.code().to_string(),
"message": err.to_string()
});
let pretty = *format == OutputFormat::Json && std::io::stderr().is_terminal();