Skip to main content
Glama

my-eli-mcp

An MCP server for Laws of Malaysia Online (lom.agc.gov.my), the Attorney-General's Chambers' official portal for Malaysian federal legislation. It fetches and cites principal Acts, with a verifiable citation on every response.

Part of the MateMatic eu-legal-mcp production line, extended into Asia alongside jp-eli-mcp and sg-eli-mcp. Same citation contract (a stable identifier + a human-readable citation + a source URL), adapted for a jurisdiction with no ELI, no confirmed search API, and a source that publishes only PDF.

Scope. This MVP covers principal Acts only, addressed by their numeric act coordinate (e.g. 883). No free-text search API was found on this portal during discovery; amendments and subsidiary legislation (P.U. (A)/(B) notices) are not yet covered. Every response carries a dataset_note.

Licence. lom.agc.gov.my legislation is official public information published by the Attorney-General's Chambers of Malaysia. This connector relays it with attribution and a source_url.

The tools

Tool

What it does

my_get_act

Metadata for a principal Act by its numeric act coordinate.

my_get_text

The full text of an Act, extracted from the official PDF.

my_coverage

Declare what this connector covers, when each family was captured, and - explicitly - what it does NOT cover. Every gap carries a fallback.

Every response carries the contract: eli_uri (Malaysia has no ELI - this is the durable lom.agc.gov.my act page URL, e.g. https://lom.agc.gov.my/act-detail.php?language=BI&act=883, see eli_note), human_readable_citation (derived from the official PDF's own filename, since the portal carries no separate title metadata), and source_url.

Related MCP server: sg-eli-mcp

Install

Not yet on PyPI - install from source until the first release ships:

git clone https://github.com/matematicsolutions/my-eli-mcp
cd my-eli-mcp
pip install -e .

Once released, this will be uvx my-eli-mcp.

Configuration via env:

  • MY_ELI_BASE_URL - default https://lom.agc.gov.my

  • MY_ELI_CACHE_DIR - default ~/.matematic/cache/my-eli

  • MY_ELI_AUDIT_DIR - default ~/.matematic/audit

No API key. lom.agc.gov.my is keyless.

Configure (Claude Code / any MCP client)

{
  "mcpServers": {
    "my-eli-mcp": { "command": "my-eli-mcp" }
  }
}

Windows 11 with Smart App Control

Smart App Control blocks unsigned executables, which covers uvx.exe, pip.exe and the my-eli-mcp.exe launcher that pip writes at install time. The python.exe and py.exe from the python.org installer are signed by the Python Software Foundation, so running the module through the interpreter works:

python -m pip install my-eli-mcp
python -m my_eli_mcp

pip.exe is blocked for the same reason, so install with python -m pip, not pip install. If python is not on PATH, use the Windows launcher: py -3 -m my_eli_mcp.

{ "mcpServers": { "my-eli-mcp": { "command": "python", "args": ["-m", "my_eli_mcp"] } } }

Do not turn Smart App Control off to work around this - it cannot be re-enabled without reinstalling Windows.

Governance

  • Public data only - read-only against lom.agc.gov.my; no client data leaves the machine.

  • Audit log - every tool call appends one JSON line to ~/.matematic/audit/my-eli-mcp.jsonl.

  • Vendor-neutral - talks only to lom.agc.gov.my; no LLM provider, no telemetry.

  • Verifiable citations - every response is independently checkable via source_url.

See CONSTITUTION.md and DISCOVERY.md.

Tests

pip install -e ".[dev]"
pytest tests/test_instructions_drift.py -v   # offline
pytest tests/test_smoke.py -v                # hits live lom.agc.gov.my

Licence

Apache-2.0. © Matematic Solutions / Wieslaw Mazur.

Available Tools

3 tools
my_coverageA
Read-onlyIdempotent

Declare what this connector covers, how it is sourced, and what it does NOT cover.

Call this before telling a user that the law "does not contain" something, and whenever a search comes back empty: the absence may be a gap in this connector rather than in the law. Every gap carries a fallback saying where to look instead.

Returns: Coverage with families, an as-of note, and a non-empty list of known gaps.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusNo
familiesNo
as_of_noteYesStates what the dates mean, and what they do not promise.
known_gapsNoNever empty. An empty list would mean 'not checked', not 'no gaps'.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already include readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds valuable behavioral context beyond these: it explains that empty search results may indicate a coverage gap and that each gap includes a fallback direction. It also notes the return object has a 'non-empty list' of gaps, which is a behavioral guarantee not captured in annotations.

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 concise and well-structured. The first sentence delivers the core purpose, the second gives concrete usage scenarios, and the third summarizes the return value. Every sentence earns its place, with no redundancy or filler.

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

Completeness5/5

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

Given the tool has no parameters, rich annotations, and an output schema, the description provides all necessary context for an agent to invoke it correctly. It covers what the tool does, when to use it, and what it returns, making it complete for its simplicity.

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

Parameters4/5

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

The tool has zero parameters, and the schema coverage is 100% (trivially). Since there are no parameters to document, the baseline for parameter semantics is 4. The description does not need to add anything beyond the schema here.

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 tool's purpose: 'Declare what this connector covers, how it is sourced, and what it does NOT cover.' It specifies a concrete verb (declare), a resource (coverage), and distinguishes itself from siblings by focusing on coverage metadata rather than retrieving specific acts or text.

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 explicit usage triggers: 'Call this before telling a user that the law does not contain something, and whenever a search comes back empty.' This clearly indicates when to use the tool. However, it does not explicitly mention when not to use it or name alternative tools, so it falls slightly short of a 5.

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

my_get_actA
Read-onlyIdempotent

Fetch metadata for a Malaysian principal Act by its numeric act coordinate.

ParametersJSON Schema
NameRequiredDescriptionDefault
act_numberYese.g. ``883``.

Output Schema

ParametersJSON Schema
NameRequiredDescription
titleNo
eli_uriNo
eli_noteNo
pdf_pathNo
act_numberYes
source_urlNo
dataset_noteNo
human_readable_citationNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the safety profile is covered. The description adds that the tool returns metadata specifically, distinguishing it from text retrieval, but does not disclose any additional behavioral traits such as rate limits, authorization, or error handling.

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 clear sentence with no redundant wording. It efficiently conveys the tool's purpose and scope without any fluff or repetition of schema details.

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 simplicity (one parameter), the presence of an output schema, and strong annotations, the description is functionally complete for selecting and invoking the tool. It doesn't explain return values, but the output schema handles that gap. Some information about when to use vs. the sibling would improve completeness, but it's not essential for a tool this simple.

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?

The schema already covers act_number fully as an integer with an example, giving 100% schema description coverage. The phrase 'numeric act coordinate' in the description is essentially a synonym for the schema's type and example, adding no significant new meaning. Baseline 3 is appropriate.

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

Purpose4/5

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

The description clearly states the tool fetches metadata for Malaysian principal Acts using a numeric act coordinate. It differentiates from the sibling 'my_get_text' by specifying 'metadata' rather than text, but it does not explicitly reference the sibling or contrast them.

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 description implies when to use this tool (when needing metadata for a Malaysian act) but provides no explicit guidance about alternatives like 'my_get_text' or exclusions. The 'metadata' keyword hints at the distinction, but explicit when/when-not guidance is absent.

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

my_get_textB
Read-onlyIdempotent

Fetch the full text of a Malaysian principal Act (extracted from its official PDF).

ParametersJSON Schema
NameRequiredDescriptionDefault
act_numberYese.g. ``883``.

Output Schema

ParametersJSON Schema
NameRequiredDescription
titleNo
contentNo
eli_uriNo
pdf_urlNo
eli_noteNo
byte_sizeNo
text_noteNo
act_numberYes
source_urlNo
dataset_noteNo
human_readable_citationNo

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds context about the source (extracted from official PDF) and the scope (principal Act), but does not disclose limitations such as whether 'full text' includes schedules or what happens for unavailable acts. This is acceptable given the annotation coverage, but not rich.

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, front-loaded sentence with no redundant words. It communicates the essential purpose and source efficiently. No filler or repetition of annotations/schema.

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?

The tool is simple (one parameter, output schema provided, good annotations). The description is adequate as a minimal viable explanation, but it omits usage context (e.g., when to choose this over my_get_act) and does not clarify what 'full text' encompasses. Given the availability of output schema and annotations, this is a clear but not exhaustive description.

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

Parameters4/5

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

The schema provides only an example ('e.g. ``883``') for the act_number parameter, not a semantic definition. The description's mention of 'Malaysian principal Act' implicitly clarifies that act_number refers to the act's number, adding meaning beyond the schema. This helps an agent understand how to fill the parameter.

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

Purpose4/5

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

The description uses a specific verb ('Fetch') and identifies a clear resource ('full text of a Malaysian principal Act'), which gives a precise purpose. It does not explicitly distinguish from the sibling tool my_get_act, but the name and description imply a focus on text content rather than the act object itself.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus the sibling my_get_act, nor any mention of exclusions or prerequisites. The description simply states what the tool does, leaving the agent to infer usage context from the tool name and description alone.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev0.3.3
    • Addedmy_coverage
  2. 2 tool updatesv0.2.1
    • First observedmy_get_act
    • First observedmy_get_text

TDQS

A3.6/5.0

Scored across 3 tools

Disambiguation4/5

The three tools are largely distinct: one fetches metadata, one fetches full text, and one declares coverage/gaps. The only potential confusion is between my_get_act and my_get_text, but their descriptions clearly separate metadata from full text.

Naming Consistency3/5

Two tools follow a get_<object> pattern (my_get_act, my_get_text), but my_coverage uses a noun instead of a verb, breaking the pattern. The my_ prefix is consistent, but the mixed verb/noun structure is a minor inconsistency.

Tool Count4/5

Three tools is on the lower end but reasonable for a narrowly scoped connector that serves act metadata, act text, and coverage declarations. It feels slightly thin but not inadequate for its stated purpose.

Completeness3/5

The connector covers fetching individual acts and declaring coverage gaps, but lacks obvious operations like listing all acts or searching across acts. The coverage tool helps mitigate the absence, but the surface remains somewhat incomplete for a legal research tool.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    An MCP server that provides access to the Irish Statute Book, enabling retrieval of metadata and full enacted text for Irish acts and statutory instruments by year, number, and type, with verifiable ELI identifiers and citations.
    3
    Apache 2.0
  • A
    license
    A
    quality
    A
    maintenance
    An MCP server for Singapore Statutes Online (SSO), the official portal for Singapore legislation. It browses, fetches, and cites Acts, with a verifiable citation on every response.
    4
    3
    Apache 2.0
  • A
    license
    A
    quality
    A
    maintenance
    MCP server for Australia's Federal Register of Legislation. Enables searching and fetching Commonwealth Acts with verifiable citations.
    3
    Apache 2.0