Koskamo

EVS Meter Tools MCP

An unofficial MCP server for checking EVS prepaid electricity meters at NUS and SUTD hostels and retrieving top-up links. It allows agents to get meter balances, usage data, recent top-ups, and payment links without handling payments directly.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

EVS Meter Tools MCP logo, by nicholasohjjCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-06Published by nicholasohjj
MCP endpoint (Streamable HTTP)
https://nusaircon-production.up.railway.app/mcp
Vendor documentation

What its tools do

4 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

4 of 4 have a description · 4 of 4 declare behavior hints · 4 of 4 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Check EVS prepaid electricity meter balance
  • Retrieve recent top-up history
  • Get meter usage data for NUS hostels
  • Obtain top-up links for card payment

Source and maintenance

Community listingRegistry 2.0.1
Maintenance checked

Protocol and capabilities

Server
evs-meter-tools 2.0.1
MCP protocol negotiated in check
2025-11-25
Tools
4 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Read-only tools for EVS prepaid electricity meters at NUS and SUTD hostels. Ask for the user's 8-digit meter ID and whether it is an NUS or SUTD meter if you do not know them. Usage history is available for NUS meters only. You cannot make payments. To top up, use get_topup_link and give the user the link. Never ask for card details in the conversation. Errors are JSON with a code, a message, and whether retrying can help. If retryable is false, ask the user instead of calling again. To confirm a payment, follow the steps in get_recent_topups. Never tell the user to pay again just because a top-up has not appeared yet.

Tools

4 advertised

get_meter_balance — Get meter balance
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Get the current prepaid credit balance of a meter, in SGD.

get_meter_balance input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "meter_id",
    "system"
  ],
  "properties": {
    "system": {
      "enum": [
        "nus",
        "sutd"
      ],
      "type": "string",
      "description": "The institution the meter belongs to"
    },
    "meter_id": {
      "type": "string",
      "pattern": "^\\d{8}$",
      "description": "The 8-digit EVS meter ID"
    }
  }
}
get_meter_balance output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "meterId",
    "system",
    "balanceSgd",
    "checkedAt"
  ],
  "properties": {
    "system": {
      "enum": [
        "nus",
        "sutd"
      ],
      "type": "string",
      "description": "The institution the meter belongs to"
    },
    "meterId": {
      "type": "string"
    },
    "checkedAt": {
      "type": "string",
      "description": "When this was checked, as an ISO 8601 time"
    },
    "balanceSgd": {
      "type": [
        "number",
        "null"
      ]
    }
  },
  "additionalProperties": false
}
get_meter_balance annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
get_meter_usage — Get meter usage
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Get up to 7 days of usage for an NUS meter, with spending analysis, month-to-date spending, and how long the balance may last. Amounts are in SGD. Dates are as EVS reports them, with no time zone, and recent days may be missing. Not available for SUTD meters.

get_meter_usage input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "meter_id"
  ],
  "properties": {
    "meter_id": {
      "type": "string",
      "pattern": "^\\d{8}$",
      "description": "The 8-digit EVS meter ID"
    }
  }
}
get_meter_usage output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "meterId",
    "system",
    "balanceSgd",
    "checkedAt",
    "usage"
  ],
  "properties": {
    "usage": {
      "type": "object",
      "required": [
        "requestedDays",
        "daysWithData",
        "history",
        "analysis",
        "estimatedDaysLeft",
        "rank",
        "monthToDateSgd"
      ],
      "properties": {
        "rank": {
          "anyOf": [
            {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "additionalProperties": {}
            },
            {
              "type": "null"
            }
          ]
        },
        "history": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "date",
              "amountSgd"
            ],
            "properties": {
              "date": {
                "type": "string"
              },
              "amountSgd": {
                "type": [
                  "number",
                  "null"
                ]
              }
            },
            "additionalProperties": false
          }
        },
        "analysis": {
          "type": "object",
          "required": [
            "avgDailySgd",
            "totalSgd",
            "lastDaySgd",
            "zeroStreak",
            "spike",
            "warnings"
          ],
          "properties": {
            "spike": {
              "anyOf": [
                {
                  "type": "object",
                  "required": [
                    "lastDaySgd",
                    "avgDailySgd",
                    "factor"
                  ],
                  "properties": {
                    "factor": {
                      "type": "number"
                    },
                    "lastDaySgd": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "avgDailySgd": {
                      "type": [
                        "number",
                        "null"
                      ]
                    }
                  },
                  "additionalProperties": false
                },
                {
                  "type": "null"
                }
              ]
            },
            "totalSgd": {
              "type": [
                "number",
                "null"
              ]
            },
            "warnings": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "lastDaySgd": {
              "type": [
                "number",
                "null"
              ]
            },
            "zeroStreak": {
              "type": "number"
            },
            "avgDailySgd": {
              "type": [
                "number",
                "null"
              ]
            }
          },
          "additionalProperties": false
        },
        "daysWithData": {
          "type": "number",
          "description": "How many days the averages are based on. Can be under requestedDays."
        },
        "requestedDays": {
          "type": "number"
        },
        "monthToDateSgd": {
          "type": [
            "number",
            "null"
          ]
        },
        "estimatedDaysLeft": {
          "type": [
            "number",
            "null"
          ],
          "description": "Balance divided by average daily spending. Null if unknown."
        }
      },
      "additionalProperties": false
    },
    "system": {
      "enum": [
        "nus",
        "sutd"
      ],
      "type": "string",
      "description": "The institution the meter belongs to"
    },
    "meterId": {
      "type": "string"
    },
    "checkedAt": {
      "type": "string",
      "description": "When this was checked, as an ISO 8601 time"
    },
    "balanceSgd": {
      "type": [
        "number",
        "null"
      ]
    }
  },
  "additionalProperties": false
}
get_meter_usage annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
get_recent_topups — Get recent top-ups
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Get up to 10 recent top-ups for a meter. To confirm a payment, look for a top-up with the same amount dated after the createdAt of its link, and with no status showing it failed. Earlier top-ups can have the same amount, so always check the date. Dates have no time zone and appear to be Singapore time (UTC+8), while createdAt is ISO 8601. If nothing matches, the payment may not be recorded yet or may have failed: check again later, and have the user check their card statement before paying again.

get_recent_topups input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "meter_id",
    "system"
  ],
  "properties": {
    "system": {
      "enum": [
        "nus",
        "sutd"
      ],
      "type": "string",
      "description": "The institution the meter belongs to"
    },
    "meter_id": {
      "type": "string",
      "pattern": "^\\d{8}$",
      "description": "The 8-digit EVS meter ID"
    }
  }
}
get_recent_topups output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "meterId",
    "system",
    "balanceSgd",
    "checkedAt",
    "topups"
  ],
  "properties": {
    "system": {
      "enum": [
        "nus",
        "sutd"
      ],
      "type": "string",
      "description": "The institution the meter belongs to"
    },
    "topups": {
      "type": "object",
      "required": [
        "lookbackDays",
        "source",
        "history"
      ],
      "properties": {
        "source": {
          "type": "string"
        },
        "history": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "date",
              "amountSgd",
              "reference"
            ],
            "properties": {
              "date": {
                "type": "string"
              },
              "status": {
                "type": "string",
                "description": "EVS's status for this top-up, when it gives one"
              },
              "amountSgd": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "reference": {
                "type": "string"
              }
            },
            "additionalProperties": false
          }
        },
        "lookbackDays": {
          "type": [
            "number",
            "null"
          ]
        }
      },
      "additionalProperties": false
    },
    "meterId": {
      "type": "string"
    },
    "checkedAt": {
      "type": "string",
      "description": "When this was checked, as an ISO 8601 time"
    },
    "balanceSgd": {
      "type": [
        "number",
        "null"
      ]
    }
  },
  "additionalProperties": false
}
get_recent_topups annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
get_topup_link — Get top-up link
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Create a link to the secure top-up page, for the user to open and pay by card themselves. Creating the link charges nothing. Refuses a meter EVS doesn't recognise. If EVS can't be reached, meterVerified is false, so ask the user to check the meter on the page. NUS allows $6-$50 and SUTD allows $10-$50.

get_topup_link input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "meter_id",
    "system",
    "amount_sgd"
  ],
  "properties": {
    "system": {
      "enum": [
        "nus",
        "sutd"
      ],
      "type": "string",
      "description": "The institution the meter belongs to"
    },
    "meter_id": {
      "type": "string",
      "pattern": "^\\d{8}$",
      "description": "The 8-digit EVS meter ID"
    },
    "amount_sgd": {
      "type": "number",
      "description": "Top-up amount in SGD"
    }
  }
}
get_topup_link output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "url",
    "meterId",
    "system",
    "amountSgd",
    "meterVerified",
    "createdAt",
    "note"
  ],
  "properties": {
    "url": {
      "type": "string"
    },
    "note": {
      "type": "string"
    },
    "system": {
      "enum": [
        "nus",
        "sutd"
      ],
      "type": "string",
      "description": "The institution the meter belongs to"
    },
    "meterId": {
      "type": "string"
    },
    "amountSgd": {
      "type": "number"
    },
    "createdAt": {
      "type": "string",
      "description": "When the link was made, as an ISO 8601 time. Used to confirm a payment."
    },
    "meterVerified": {
      "type": "boolean"
    }
  },
  "additionalProperties": false
}
get_topup_link annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1893 ms
95th percentile latency
1893 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1893 ms · metadata changed · 4 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http evs-meter-tools-mcp https://nusaircon-production.up.railway.app/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add evs-meter-tools-mcp --url https://nusaircon-production.up.railway.app/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable evs-meter-tools-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "evs-meter-tools-mcp": {
      "url": "https://nusaircon-production.up.railway.app/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "evs-meter-tools-mcp": {
      "type": "streamableHttp",
      "url": "https://nusaircon-production.up.railway.app/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start evs-meter-tools-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "evs-meter-tools-mcp": {
      "type": "http",
      "url": "https://nusaircon-production.up.railway.app/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http evs-meter-tools-mcp https://nusaircon-production.up.railway.app/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://nusaircon-production.up.railway.app/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "evs-meter-tools-mcp": {
      "serverUrl": "https://nusaircon-production.up.railway.app/mcp"
    }
  }
}

Let your agent find its tools

Find servers like EVS Meter Tools MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.