Skip to main content
Glama

extract_finance_landscape

Read-only

Analyze financial assets by aggregating real-time market data, developer sentiment from Hacker News, investor discussions from Reddit, GitHub ecosystem activity, and product release velocity into a unified timestamped report.

Instructions

Composite financial intelligence tool for developers. Given one or more ticker symbols, simultaneously queries: (1) Yahoo Finance for live price/market data, (2) Hacker News for developer community sentiment, (3) Reddit for investor and tech community discussion, (4) GitHub for repo ecosystem activity around the company's tech, and (5) their product changelog for release velocity as a company health signal. Answers: What's the price? What are developers saying? Is the company actually shipping? Returns a unified 5-source timestamped report. Bloomberg Terminal doesn't give you this.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
tickersYesOne or more ticker symbols e.g. 'PLTR' or 'PLTR,MSFT,GOOG'. Up to 5 tickers.
company_nameNoCompany name for HN/Reddit/GitHub searches e.g. 'Palantir'. If omitted, derived from the ticker.
github_queryNoGitHub search query or repo URL for the company's tech ecosystem e.g. 'palantir' or 'https://github.com/palantir/foundry'. If omitted, uses company_name.
max_lengthNo

Implementation Reference

  • The implementation handler for the 'extract_finance_landscape' tool, which orchestrates calls to various adapters (finance, hackerNews, reddit, repoSearch, changelog) in parallel to generate a comprehensive report.
    async ({ tickers, company_name, github_query, max_length }) => {
      const perSection = Math.floor((max_length ?? 12000) / 5);
      // Derive a search term: prefer explicit company_name, fall back to first ticker
      const searchTerm = company_name ?? tickers.split(",")[0].trim();
      const repoQuery = github_query ?? searchTerm;
    
      // All five sources fire in parallel
      const [priceResult, hnResult, redditResult, repoResult, changelogResult] = await Promise.allSettled([
        // 1. The anchor: live price, market cap, P/E, 52w range
        financeAdapter({ url: tickers, maxLength: perSection }),
        // 2. Developer sentiment: what engineers think of this company's tech
        hackerNewsAdapter({
          url: `https://hn.algolia.com/api/v1/search?query=${encodeURIComponent(searchTerm)}&tags=story&hitsPerPage=10`,
          maxLength: perSection,
        }),
        // 3. Broader community: investor and tech community discussion on Reddit
        redditAdapter({ url: `https://www.reddit.com/search.json?q=${encodeURIComponent(searchTerm)}&sort=new&limit=15`, maxLength: perSection }),
        // 4. Repo ecosystem: how many GitHub projects orbit this company's technology
        repoSearchAdapter({ url: repoQuery, maxLength: perSection }),
        // 5. Release velocity: is the company actually shipping product right now
        changelogAdapter({ url: repoQuery, maxLength: perSection }),
      ]);
    
      const section = (
        label: string,
        result: PromiseSettledResult<{ raw: string; content_date: string | null; freshness_confidence: string }>
      ) =>
        result.status === "fulfilled"
          ? `## ${label}\n${result.value.raw}`
          : `## ${label}\n[Unavailable: ${(result as PromiseRejectedResult).reason}]`;
    
      const combined = [
        `# Finance + Developer Intelligence: "${tickers}"${company_name ? ` (${company_name})` : ""}`,
        `Generated: ${new Date().toISOString()}`,
        `Sources: Yahoo Finance ยท Hacker News ยท Reddit ยท GitHub ยท Changelog`,
        "",
        section("๐Ÿ“ˆ Market Data (Yahoo Finance)", priceResult),
        section("๐Ÿ’ฌ Developer Sentiment (Hacker News)", hnResult),
        section("๐Ÿ—ฃ๏ธ Community Discussion (Reddit)", redditResult),
        section("๐Ÿ“ฆ Repo Ecosystem (GitHub)", repoResult),
        section("๐Ÿ”„ Product Release Velocity (Changelog)", changelogResult),
      ].join("\n\n");
    
      return { content: [{ type: "text", text: combined }] };
  • The registration and input schema definition for the 'extract_finance_landscape' tool.
    server.registerTool(
      "extract_finance_landscape",
      {
        description:
          "Composite financial intelligence tool for developers. Given one or more ticker symbols, simultaneously queries: (1) Yahoo Finance for live price/market data, (2) Hacker News for developer community sentiment, (3) Reddit for investor and tech community discussion, (4) GitHub for repo ecosystem activity around the company's tech, and (5) their product changelog for release velocity as a company health signal. Answers: What's the price? What are developers saying? Is the company actually shipping? Returns a unified 5-source timestamped report. Bloomberg Terminal doesn't give you this.",
        inputSchema: z.object({
          tickers: z.string().describe(
            "One or more ticker symbols e.g. 'PLTR' or 'PLTR,MSFT,GOOG'. Up to 5 tickers."
          ),
          company_name: z.string().optional().describe(
            "Company name for HN/Reddit/GitHub searches e.g. 'Palantir'. If omitted, derived from the ticker."
          ),
          github_query: z.string().optional().describe(
            "GitHub search query or repo URL for the company's tech ecosystem e.g. 'palantir' or 'https://github.com/palantir/foundry'. If omitted, uses company_name."
          ),
          max_length: z.number().optional().default(12000),
        }),
        annotations: { readOnlyHint: true, openWorldHint: true },
      },
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=true and openWorldHint=true, but the description adds valuable behavioral context beyond this. It specifies that the tool queries five specific external sources simultaneously, returns a unified timestamped report, and has a practical limitation ('Up to 5 tickers' mentioned in schema). However, it doesn't disclose rate limits, authentication needs, or potential data freshness issues that would be helpful for an agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately sized and front-loaded, starting with the core purpose and listing the five data sources. Every sentence adds value, though the Bloomberg Terminal comparison at the end feels slightly promotional rather than strictly functional. The structure efficiently communicates the tool's scope without unnecessary fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (composite queries across five sources) and lack of output schema, the description does a good job explaining what the tool returns ('unified 5-source timestamped report') and its composite nature. However, it could better address how the five data streams are integrated or what the report structure looks like, which would help an agent understand the output format.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 75% schema description coverage, the baseline is 3. The description doesn't add meaningful parameter semantics beyond what's already in the schema descriptions (e.g., it doesn't explain how 'max_length' affects the report or provide examples for 'github_query' beyond what the schema says). The description focuses on the tool's composite nature rather than parameter details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool's purpose: it's a composite financial intelligence tool that simultaneously queries five specific data sources (Yahoo Finance, Hacker News, Reddit, GitHub, product changelog) for ticker symbols. It clearly distinguishes itself from sibling tools by being the only one that combines these five sources into a unified report, unlike specialized siblings like extract_yc or extract_github.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool: for developers needing a multi-source financial intelligence report. However, it doesn't explicitly state when not to use it or name specific alternatives among the sibling tools (e.g., use extract_yc for Y Combinator data instead). The Bloomberg Terminal comparison implies a unique value proposition but doesn't offer concrete guidance on tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/PrinceGabriel-lgtm/freshcontext-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server