Skip to main content
Glama

get_issuer_outstanding_bonds

Retrieve an issuer's outstanding bond issues from their EMMA profile, including issue description, dated date, and maturity range. Get a reliable drill-down on any municipal bond issuer.

Instructions

List an issuer's outstanding bond issues from their EMMA profile — issue description, dated date, maturity range. The most reliable drill-down on any issuer.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
issuer_idNoEMMA issuer GUID (from search_issuers_by_state)
issuer_urlNoAny EMMA issuer URL (from emma_quick_search; can be a QuickSearch/Navigate redirect)
limitNo

Implementation Reference

  • server.py:536-556 (registration)
    Tool registration in list_tools() — defines the schema for get_issuer_outstanding_bonds with issuer_id, issuer_url, and limit parameters.
        name="get_issuer_outstanding_bonds",
        description=(
            "List an issuer's outstanding bond issues from their EMMA profile — "
            "issue description, dated date, maturity range. The most reliable "
            "drill-down on any issuer."
        ),
        inputSchema={
            "type": "object",
            "properties": {
                "issuer_id": {
                    "type": "string",
                    "description": "EMMA issuer GUID (from search_issuers_by_state)",
                },
                "issuer_url": {
                    "type": "string",
                    "description": "Any EMMA issuer URL (from emma_quick_search; can be a QuickSearch/Navigate redirect)",
                },
                "limit": {"type": "integer", "default": 25},
            },
        },
    ),
  • Handler in _dispatch() — navigates to the EMMA issuer page, waits for the #lvIssues table, scrapes rows including issue URLs, structures the data, and returns a limited list of outstanding bond issues.
    if name == "get_issuer_outstanding_bonds":
        iid = args.get("issuer_id")
        iurl = args.get("issuer_url")
        if iid:
            url = f"{EMMA_BASE}/IssuerHomePage/Issuer?id={iid}&type=M"
        elif iurl:
            url = iurl
        else:
            return {"error": "issuer_id or issuer_url is required"}
        async with new_page() as page:
            await page.goto(url, wait_until=NAV_WAIT, timeout=NAV_TIMEOUT_MS)
            try:
                await page.wait_for_selector("#lvIssues tbody tr", timeout=15000)
            except Exception:
                pass
            await page.wait_for_timeout(500)
            data = await page.evaluate(
                """() => {
                    const t = document.getElementById('lvIssues');
                    if (!t) return {header: [], rows: []};
                    const head = Array.from(t.querySelectorAll('thead th')).map(th => th.innerText.trim());
                    const rows = Array.from(t.querySelectorAll('tbody tr')).map(tr => {
                        const cells = Array.from(tr.cells).map(td => td.innerText.trim());
                        const a = tr.querySelector('a[href*="IssueView/Details/P"]');
                        return {cells, issue_url: a ? a.href : null};
                    });
                    return {header: head, rows};
                }"""
            )
        header = data.get("header", [])
        raw_rows = data.get("rows", [])
        issues: list[dict[str, Any]] = []
        for r in raw_rows:
            item = structured(header, [r.get("cells", [])])
            if item:
                row = item[0]
                if r.get("issue_url"):
                    row["issue_url"] = r["issue_url"]
                issues.append(row)
        return {
            "issuer_id": iid,
            "issuer_url": url,
            "count": len(issues),
            "issues": issues[: int(args.get("limit", 25))],
        }
  • Input schema for get_issuer_outstanding_bonds — accepts optional issuer_id, issuer_url, and limit.
    inputSchema={
        "type": "object",
        "properties": {
            "issuer_id": {
                "type": "string",
                "description": "EMMA issuer GUID (from search_issuers_by_state)",
            },
            "issuer_url": {
                "type": "string",
                "description": "Any EMMA issuer URL (from emma_quick_search; can be a QuickSearch/Navigate redirect)",
            },
            "limit": {"type": "integer", "default": 25},
        },
    },
Behavior2/5

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

No annotations are provided, so the description must fully disclose behavioral traits. It only states the function and return fields, omitting important details like read-only nature, authentication requirements, rate limits, or side effects. The lack of transparency for a read-like operation leaves the agent with minimal guidance.

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

Conciseness5/5

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

The description is a single sentence that is front-loaded with the action and returns. It contains no unnecessary words and efficiently conveys the core function.

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

Completeness3/5

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

For a tool with no output schema and moderate complexity (3 params, no annotations), the description provides only basic return fields. It lacks details on response structure, pagination, error handling, and ordering. It is minimally viable but has clear gaps in completeness.

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

Parameters2/5

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

Schema coverage is 67% (2 of 3 parameters have descriptions), but the tool description adds no information about parameters. It does not explain the usage difference between issuer_id and issuer_url, nor does it describe the limit parameter's meaning and effect. The description could have compensated, but it did not.

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 clearly states the verb 'List' and the resource 'an issuer's outstanding bond issues', specifying the fields returned (issue description, dated date, maturity range). It distinguishes from sibling tools like get_issue_details or get_security_details by focusing on outstanding bonds and claiming to be the most reliable drill-down.

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

Usage Guidelines3/5

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

The phrase 'The most reliable drill-down on any issuer' implies when to use it, but there is no explicit guidance on when not to use it or comparisons with alternatives. Usage is implied rather than clearly stated, earning a score of 3.

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/ark9164-create/blaylock-emma-mcp'

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