agentlookups.ai / docs / Overassessed
Overassessed checks whether a Maryland property assessment is fair next to genuinely similar homes, using the state's own assessment roll. It says where the assessment sits among those homes, gives Maryland's appeal windows with the official filing links, and builds a page you can print as evidence for an appeal. It works on its website, through an AI assistant over MCP, and as a plain HTTPS API.
Maryland reassesses each property once every three years, and filing an appeal is free. Overassessed answers the question to ask first: is this assessment in line with similar homes? For one address it finds the similar homes on the roll. In the words of its evidence packet, "similar" means "same reassessment group, same zip code, same land-use class, living area within 30%, lot size within 50%, and year built within 20 years." It then says where the assessment sits among them and, when enough of them sold recently, how the group's assessments compare with sale prices.
The data is a copy of the public real property assessment roll of the Maryland State Department of Assessments and Taxation (SDAT), about 2.4 million parcels, refreshed monthly. The home page shows the current parcel count and the month of the roll data. Owner names on the roll never reach Overassessed's systems, so it cannot show or search them. The official record, in SDAT's Real Property search, is authoritative. The explainer page covers the three-year cycle, the phase-in and the appeal steps, with links to SDAT.
Overassessed is in beta. It is free during beta, with no account and no API key. Features, access and pricing may change. Rate limits apply.
https://overassessed.agentlookups.ai/mcp as the server URL. If it asks for a name, use Overassessed.On a Team or Enterprise plan, an owner adds the connector first, under Organization settings > Connectors (Add, then Custom, then Web). Members then find it under Customize > Connectors and click Connect. Overassessed is not in Claude's connector directory yet, so add it this way.
claude mcp add --transport http overassessed https://overassessed.agentlookups.ai/mcp
Add a remote MCP server with the URL https://overassessed.agentlookups.ai/mcp, transport Streamable HTTP, no authentication. Menu names differ by client and plan. The server keeps no session and replies with plain JSON. It takes POST only, one JSON-RPC request per POST, with the headers content-type: application/json and accept: application/json, text/event-stream. To test it by hand:
curl -X POST https://overassessed.agentlookups.ai/mcp \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":"check_assessment",
"arguments":{"address":"101 N COURT ST","zip":"21701"}}}'
No MCP needed. This URL returns the check for Frederick City Hall as JSON:
https://overassessed.agentlookups.ai/v1/check?address=101+N+COURT+ST&zip=21701
To fetch one parcel by its SDAT account id, send acct= in place of address= and zip=. The zip is five digits; a ZIP+4 such as 21202-1234 works too, read as its first five digits. One match returns HTTP 200, several matches HTTP 300, no match HTTP 404, and a malformed zip or account id HTTP 400. /llms.txt sums up the service for AI agents.
check_assessment: checks one Maryland assessment against similar homes, found by street address plus zip, or by SDAT account id (acct, which wins over an address). Returns the parcel record, where it sits among similar homes, the verdict in plain words, Maryland's appeal windows with filing links, two honesty notes and the roll's dates. Read-only.Two web pages go with it, for handing to a person. Each takes the account_id from an answer:
https://overassessed.agentlookups.ai/check?acct=<account_id>: the verdict page, with appeal dates worked out for that property.https://overassessed.agentlookups.ai/packet?acct=<account_id>: the printable packet.Each prompt was run live on September 29, 2026, with the arguments an assistant would send. We use public buildings as addresses, because we do not publish private home addresses. Few properties are like a public building, so these mostly come back without a verdict. The second example is a private home, with its address left out. The roll changes monthly, so your answer may differ.
"Is the property assessment on 101 N Court St in Maryland fair?"
Call: check_assessment {"address": "101 N COURT ST"}
Came back: multiple_matches. Two parcels share that street address, one in Westminster (zip 21157) and one in Frederick (zip 21701), both tax-exempt, each with its account id, and the hint "several parcels share this address; re-query with acct=<account_id>".
Follow-up: "The one in Frederick, City Hall." Call: check_assessment {"acct": "1102031795"}
Came back: "Not enough similar homes to compare fairly." and "We found only 2 homes similar enough (same reassessment group, similar size, lot, and age, same zip). An honest answer needs more; the official record link below is the next stop." The answer also gives the record (full market value $7,040,900; reassessment cycle 2026.01, meaning January 2026), the appeal windows, the two honesty notes and the roll's dates.
"My reassessment notice came. Is my assessment too high? I'm at [street address], [zip]."
Call: check_assessment {"address": "<street as the roll writes it>", "zip": "<zip>"}
Came back, for a private home: "This assessment sits in the normal range for similar homes." with "Out of 151 similar homes, about 7 in 10 are assessed lower than this one and 3 in 10 higher." and "As a group, these homes are assessed at about 92% of what they actually sell for (based on 14 sales from 2024 through 2026)." Its taxable value was still below its full market value, so the answer added the phase-in note (see How to read results). The honest reply here is that the home is in the normal range.
"Make me something I can print for an appeal." (after the second example)
No new call. The assistant hands over https://overassessed.agentlookups.ai/packet?acct=<account_id>, with parcel.account_id from the answer.
Came back: for the home in the second example, a page titled "Assessment comparison sheet", the title a fair verdict gets (review and elevated verdicts get "Appeal evidence packet"). It holds the property record, the verdict in plain words, the 10 similar homes closest in size with their values from the roll (no owner names), the appeal dates for that home and the filing links. In its words: "Your browser's print button turns it into the paper or PDF exhibit you attach to Maryland's Petition for Review or bring to a hearing. Printing happens in your browser; we keep no copy." For Frederick City Hall, the packet declines: "We can't build an honest packet here".
"When can I appeal the assessment on Baltimore City Hall, 100 Holliday St, Baltimore, MD 21202?"
Call: check_assessment {"address": "100 HOLLIDAY ST", "zip": "21202"}
Came back: "Not enough similar homes to compare fairly." (no similar homes found), with Maryland's three windows, in the answer's words: "within 45 days of the date on a reassessment notice (notices mail in late December)"; "for the two years a home is not reassessed: a Petition for Review filed by the first working day after January 1"; "within 60 days of the transfer, for a purchase transferred between January 1 and June 30". The verdict page for its account, /check?acct=04121302001, adds dates for this property: "This home's last reassessment notice mailed in late December 2024, so its 45-day appeal window closed in February 2025. The next free option: file a Petition for Review by January 4, 2027. The next reassessment notice should mail in late December 2027, starting a fresh 45-day window." Those dates are worked out from the reassessment cycle; the date printed on the notice decides.
parcel (the record, with account_id, market_value, taxable_now and reassessed_cycle), uniformity (the numbers and the verdict), plain (the verdict in words), appeals (the three windows and the filing links), honesty (two notes) and roll (the roll's dates).multiple_matches: up to 10 parcels that share the street address, each with account_id, city, zip, land use, market value, size and year built, plus a hint and roll. Ask which one is meant, then call again with acct. Over HTTPS this is HTTP 300.error: one sentence on what went wrong, and no roll. A miss with no zip reads "no parcel matched that address; include the zip, and write it as the assessment roll does (e.g. 1 STATE CIR)". A miss with a zip, an account id the roll does not hold, and a zip outside Maryland each get their own wording (see Troubleshooting); over HTTPS these are HTTP 404. A malformed zip or account id gets an error that names the form expected; over HTTPS that is HTTP 400. Over MCP, isError stays false for all of these, so look for the error field.uniformity.Branch holds the verdict, and plain.headline says it in the service's words:
fair: "This assessment sits in the normal range for similar homes."review: "This assessment is on the high side for similar homes: worth a closer look."elevated: "This assessment is higher than almost all similar homes."insufficient: "Not enough similar homes to compare fairly." Fewer than 25 similar homes turned up. This is no finding either way; plain.body says how many were found.plain.position (fair, review and elevated only): where the assessment sits, as "about X in 10 are assessed lower than this one". It counts the full group of similar homes.plain.level: present only when at least 10 of the similar homes sold in the sales window. It compares the group's assessments with sale prices and names the count and the years, for example "(based on 14 sales from 2024 through 2026)". uniformity.RatioSales is the count. RatioFromYear and RatioToYear are the window: in the tool's words, "three calendar years ending with the year of the roll's newest sale dated on or before today". When plain.level is missing, MedianSalesRatio and COD read 0, meaning not computed.roll: as_of is the date the state last updated the roll, and pulled is the date Overassessed took its copy, both YYYY-MM-DD. overdue is true when the copy is more than 35 days old. A date the server does not know is left out: on September 29, 2026, roll read as_of 2026-09-04 and overdue false, with no pulled. The MCP server's instructions give the same date in words ("The state last updated the roll on September 4, 2026."), and the web pages give the month ("Roll data as of September 2026.").plain.phase_in: present when the taxable value is still below full market value. In its words: "The assessment is still phasing in: increases spread over three years, so the taxable amount steps up again the next year or two even with no new assessment. Decreases apply immediately."uniformity except BandSize, RatioFromYear and RatioToYear is 0, meaning not computed. On the other branches, a PctFMV of 0 is real: no similar home is assessed lower.market_value is the full market value, the figure an appeal argues about. taxable_now is this year's phased-in figure.Every one-parcel answer carries these two notes. Pass them on word for word:
This compares the official assessment record with similar homes in the same reassessment group; it is a fairness snapshot of public data, never an appraisal.
Similar-home comparisons use size, lot, age, and neighborhood bands; no comparison is perfect. The official record is authoritative: https://sdat.dat.maryland.gov/RealProperty/
Its llms.txt puts it the same way: "this is a fairness snapshot of the public record, never an appraisal; the official record is authoritative."
101 N COURT ST, FREDERICK gets no match where 101 N COURT ST matches. Case, and "Street" versus "ST", do not matter. A direction must match the roll: 101 N Court Street matches, but 101 North Court St and 101 Court St do not. When you give a zip, the check page on the website may suggest up to three close spellings the roll holds in that zip, and SDAT's search shows the exact spelling and the account number.ABCDE or 2120. Over HTTPS this is HTTP 400.account_id back as acct. The list stops at 10 parcels and shows no unit numbers, so for a condo unit, find its account number in SDAT's search. Send the account id exactly as the service prints it: digits, sometimes with a letter, and no dashes or spaces. A form such as 04-121-302001 gets an error that starts "acct is not an SDAT account id" (HTTP 400 over HTTPS), and an id the roll does not hold gets "no parcel on the roll has that account id; ids come from parcel.account_id or a multiple_matches result".isError true. Over HTTPS it is HTTP 400./mcp. The client sent GET. This server takes POST only./mcp. The request was a batch (a JSON array). Send one JSON-RPC request per POST.One privacy page and one set of terms cover all six agentlookups.ai services. In short: no accounts, no cookies, no trackers. Overassessed logs the path of each request but never the address, zip or account id you sent (a request that fails partway can leave them in an error line), and deletes its logs after 14 days. Result pages are sent no-store and noindex. Owner names on Maryland's roll never reach our systems.
Overassessed is run by TopHat Monkey Software LLC.
Last updated: September 29, 2026