Skip to main content
Glama
jeonghwanko
by jeonghwanko

login-mcp

Local Auth MCP that reuses a human-completed browser session. Never stores passwords.

A person logs into a site once in a local Chrome window. Later, an agent calls MCP tools to open that same browser, read pages, and click or type as that user. The agent never receives the password, and this server never stores one.

Site id and human confirm / 사이트와 사람 확인

Each tool takes site (a short id such as wishket). Chrome user-data directories are separate: data/sites/<site>/profile. A login on one site is not sent to another. SSO across sites breaks on purpose.

auth_confirm is not an agent allowlist, and it is not required after the allow button. A person allows the origin within the last 10 minutes:

  1. auth_login opens the login URL and a local tab. Before the button, that tab lists the login origin and the work origin. Those are a registrable-site pair, or the http(s) origins of the open tabs that are not the local allow server. For Wishket that is https://auth.wishket.com and https://www.wishket.com. Click 이 사이트 허용. That records the human signal and confirms those origins for the site immediately. The success page says 허용되었습니다. Do not call auth_confirm after the button.

  2. Or, in an interactive terminal: node dist/index.js confirm --site wishket --origin https://auth.wishket.com --work-origin https://www.wishket.com and type the code shown only in that Chrome tab. That command only records the signal. Then call auth_confirm within 10 minutes.

The code and the tab URL are not returned by the MCP tool. A forged human-signal.json is ignored (HMAC, key kept in process memory). The signal expires after 10 minutes. auth_read and auth_act still refuse origins that are not confirmed.

The operator sets LOGIN_MCP_KEY in the MCP process environment (the client env block or the service environment). login-mcp does not generate, rotate, or write this key. Do not commit it. If the running server has no key, leave it unset: there is no ciphertext, and the profile stays mode 0700 (files 0600). If LOGIN_MCP_KEY is set, the per-site profile is decrypted only while that site's Chrome is running. It is encrypted again with scrypt and AES-256-GCM as soon as that site's browser closes (switching sites, the window closing, or process shutdown) and the plaintext directory is removed. If the key is unset, there is no ciphertext; the profile stays mode 0700 (files 0600) at rest, including after the browser closes. The key is never logged. SIGKILL cannot run the close hook. On the next start, and again before a site browser is opened, a plaintext leftover is encrypted immediately when the key is set, or chmod'd to 0700/0600 when it is not. That pass does not delete the session. A profile whose SingletonLock names a live process is left alone. The old shared data/chrome-profile path is not migrated, locked, or signaled, so an already-open window there is left alone.


도구마다 site가 필요합니다 (예: wishket). Chrome 프로필은 data/sites/<site>/profile 로 나뉩니다. 한 사이트 쿠키가 다른 사이트로 가지 않으며, 사이트 간 SSO는 의도적으로 깨집니다.

auth_confirm은 에이전트 허용 목록이 아니며, 허용 버튼을 누른 뒤에는 필요하지 않습니다. 최근 10분 안에 사람이 허용해야 합니다.

  1. auth_login이 연 로컬 탭은 버튼 앞에 로그인 오리진과 작업 오리진을 보여 줍니다. 등록 가능한 사이트 쌍이거나, 로컬 허용 서버가 아닌 http(s) 탭의 오리진입니다. 위시켓은 https://auth.wishket.com 와 https://www.wishket.com 입니다. 이 사이트 허용을 누르면 신호를 기록하고 그 오리진을 바로 확인합니다. 성공 페이지는 허용되었습니다 입니다. 그 다음에 auth_confirm을 호출하지 않습니다.

  2. 또는 대화형 터미널에서 node dist/index.js confirm --site wishket --origin https://auth.wishket.com --work-origin https://www.wishket.com 를 실행하고, Chrome 탭에만 보이는 코드를 입력합니다. 이 명령은 신호만 기록합니다. 10분 안에 auth_confirm을 호출합니다.

코드와 탭 주소는 MCP 도구 결과에 나오지 않습니다. 위조한 human-signal.json은 무시됩니다. 신호는 10분 뒤 만료됩니다. 확인되지 않은 오리진은 auth_read와 auth_act가 거부합니다.

LOGIN_MCP_KEY는 운영자가 MCP 프로세스 환경에 넣습니다. 이 프로그램은 키를 만들거나 파일로 쓰지 않습니다. 커밋하지 마세요. 실행 중인 서버에 키가 없으면 그대로 둡니다. LOGIN_MCP_KEY가 있으면 그 사이트의 Chrome이 떠 있는 동안에만 프로필을 복호화합니다. 그 브라우저가 닫히면(사이트를 바꾸거나, 창을 닫거나, 프로세스가 종료되면) 바로 scrypt와 AES-256-GCM으로 다시 암호화하고 평문 디렉터리를 지웁니다. 키가 없으면 암호문은 없고, 브라우저가 닫힌 뒤에도 0700(파일 0600)만 유지합니다. 키는 로그에 남기지 않습니다. SIGKILL은 닫힘 훅을 실행할 수 없습니다. 다음 시작 때, 그리고 사이트를 열기 전에, 평문으로 남은 프로필은 키가 있으면 즉시 암호화하고 키가 없으면 0700/0600만 맞춥니다. 세션은 지우지 않습니다. SingletonLock이 살아 있는 프로세스를 가리키면 그 프로필은 그대로 둡니다. 예전 data/chrome-profile은 옮기거나 잠그거나 신호를 보내지 않습니다.

Related MCP server: Wbrowser

Security model

  • This server never asks for, types, or stores a password. It also never returns cookies, localStorage, sessionStorage, or Playwright storageState. It does not solve CAPTCHA, 2FA, or bot checks.

  • The session is the per-site Chrome profile on disk. Treat it as a secret. It is gitignored. Do not copy it into a repo, a ticket, or a log.

  • Site ids are one path segment (a-z, 0-9, _, -). Traversal and symlink profiles are refused. The daily system Chrome profile is refused.

  • Confirmed origins live in data/sites/<site>/origins.json (mode 0600) as a login origin plus optional work origins. auth_status is one line per site: site id, those origins, last used time, last confirmed time, session age in milliseconds, and session ok or needs_login. needs_login stays when a login page was actually seen. The age and timestamps sit next to that state so a stale ok is visible. It has no cookies, tokens, or URL query secrets.

  • Link-local addresses, 0.0.0.0/8, and cloud-metadata hosts are refused, including numeric encodings. Other hosts must be pinnable DNS names (or a literal address that is already allowed). auth_open, auth_read, and auth_act resolve those names again on every call, not only at auth_confirm. Resolution records every A and AAAA answer (and getaddrinfo, so localhost still works). If any answer is link-local, metadata, or unspecified, the host is refused. Chromium --host-resolver-rules MAP accepts only one replacement, so each DNS name is mapped to one address from that full set (lowest IPv4, else lowest IPv6; IPv6 literals are bracketed). The mapped address must be a member of the recorded set. After navigation, a connected address outside that set fails closed and the tab is blanked. If several addresses were resolved and the connected address cannot be checked, the call fails closed instead of trusting one arbitrary IP. The other checked addresses stay in the allow set; they are not discarded. A navigation restarts Chrome onto the new pin when the answers change. An in-page read or act does not continue on a stale pin: the page is closed and the profile is locked again. localhost and ordinary private addresses stay allowed for a local app. Only http and https URLs are allowed.

  • Navigation may stay on that site's confirmed login origin and work origins only. A navigation that crosses to an unconfirmed origin is not read; the tab is sent to about:blank and the tool returns human_action_required. That includes a final URL on a CDN, IdP, or redirect origin that was not confirmed. Subresource requests to link-local, metadata, or unspecified hosts are blocked. Other third-party hosts are not pinned. If a confirmed site lands on a login or password page, the tool returns human_action_required and does not return page text. The message says the session expired and a human must log in again. auth_confirm still requires the recent human allow signal.

  • There is no stealth mode and no fingerprint evasion. Chrome runs visibly (channel: "chrome") with the Chromium sandbox on, downloads disabled, and sync disabled.

This is for the account holder reusing their own session on their own computer. It is not a credential manager and it does not grant access the human does not already have.

Requirements

  • Node.js 20 or newer

  • Google Chrome installed locally (the google-chrome executable on PATH)

Playwright drives that installed Chrome. It does not download a bundled browser.

Install

npm install
npm run build
npm test

Cursor MCP config

stdio transport. Point the host at the built entrypoint:

{
  "mcpServers": {
    "login-mcp": {
      "command": "node",
      "args": ["/absolute/path/to/login-mcp/dist/index.js"],
      "env": {
        "LOGIN_MCP_KEY": "set-a-long-secret-here"
      }
    }
  }
}

Logs go to stderr. stdout is reserved for MCP. Do not put the key on the command line. The operator sets LOGIN_MCP_KEY in that env block. If it is omitted, the server leaves the key unset and does not generate one.

Tool flow

  1. auth_status with optional { "site": "wishket" } — one line per site: site id, confirmed origins, last used time, last confirmed time, session age, and session ok or needs_login. No cookies, tokens, or query secrets.

  2. auth_login with { "site": "wishket", "url": "https://auth.example.com/login" } — opens a visible Chrome window and returns immediately. Complete login yourself. The local tab lists the login origin and the work origin, then 이 사이트 허용. That click confirms them. The server does not type credentials. Do not call auth_confirm after the button.

  3. auth_confirm with { "site": "wishket", "origin": "https://auth.example.com", "workOrigin": "https://www.example.com" } — for the terminal confirm command. Records the human-approved pair. Refuses when the human signal is missing or older than 10 minutes. Not required after 이 사이트 허용.

  4. auth_open with { "site": "wishket", "url": "https://www.example.com/dashboard" } — that site's profile only.

  5. auth_read with { "site": "wishket", "url": "...", "selector": "main" } — visible text only. Refuses origins not confirmed for that site.

  6. auth_act with { "site": "wishket", "action": "click", "selector": "a[href='/settings']" } — one click, fill, or key press. Password fields and challenge widgets are refused.

If a result contains "human_action_required": true, stop and use the open Chrome window. Do not retry with a guessed password.

Paths

Variable

Default

LOGIN_MCP_DATA_DIR

./data

LOGIN_MCP_KEY

unset. The operator sets it in the MCP process environment. The server never generates or writes it. Unset means chmod 0700/0600 only.

Profiles are $LOGIN_MCP_DATA_DIR/sites/<site>/profile. LOGIN_MCP_USER_DATA_DIR is ignored so an older shared profile is not reused. Never point the data directory at a directory you commit, or at a Chrome profile path.

Troubleshooting

Chrome locks the user-data directory. If launch fails because Chrome is already running with this site's profile, close that window and retry. Do not delete the profile if you want to keep the session. Do not point the data directory at your normal Chrome profile or at a symlink. If a confirmed site redirects to another origin, the human must allow that origin too (the work origin field) before auth_open or auth_read can succeed.

Development

npm test
npm run build
npm start

npm start waits on stdin for an MCP client. Stop it with Ctrl+C, which closes Chrome and locks profiles. SIGKILL skips that hook. The next start seals a leftover plaintext profile (encrypt when LOGIN_MCP_KEY is set, otherwise chmod 0700/0600) without deleting the session. Do not kill or migrate a Chrome window that is already using data/chrome-profile.

Available Tools

6 tools
auth_actA

Perform one click, fill, or press on this site's current page. Re-resolves DNS on every call. Refuses unconfirmed origins, password fields, and challenge widgets. fill and press require value. Does not solve CAPTCHA or 2FA.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteYesSite id: 1-64 characters of a-z, 0-9, underscore, or hyphen. Each site has its own Chrome profile.
valueNoText for fill, or key for press. Never a password. Required for fill and press.
actionYesThe single action to perform.
selectorYesPlaywright selector for the element. Password fields are refused.

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does substantial work: it discloses DNS re-resolution per call, refusal of unconfirmed origins, password fields, and challenge widgets, and that fill/press require a value. It stops short of stating auth requirements or what the response returns.

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?

Four short sentences with the core action front-loaded, and the value-requirement clause placed after. 'Re-resolves DNS on every call' is slightly tangential but earns its place as a behavioral hint; otherwise there is little waste.

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?

For a 4-param mutation tool with no annotations and no output schema, the description covers behavioral constraints and refusals well. It lacks return-value and authentication details, but given the sibling family (auth_login, auth_status, auth_read) the missing pieces are modest.

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?

Schema description coverage is 100%, so the schema already documents all four parameters, including 'value' required for fill/press and selector details. The description only echoes the 'fill and press require value' constraint, adding no syntax or format meaning beyond the schema; baseline 3 applies.

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 states a specific verb set (click, fill, press) acting on a specific resource (this site's current page), which is concrete. It doesn't explicitly distinguish itself from siblings like auth_login, auth_open, or auth_read, but the single-action framing is clear enough for an agent to select it.

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?

It gives some negative guidance (does not solve CAPTCHA or 2FA, refuses unconfirmed origins/password fields/challenge widgets), which implies when-not. However it never names when to prefer a sibling (e.g., auth_login for authenticating, auth_read for reading) or states prerequisites, so usage is only implied.

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

auth_confirmA

Record origins for one site after a human allow signal from the last 10 minutes. The 이 사이트 허용 button already confirms origins; use this after the terminal confirm command. Refuses if that signal is missing. Optional workOrigin must be part of the same human signal. Does not read cookies.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteYesSite id: 1-64 characters of a-z, 0-9, underscore, or hyphen. Each site has its own Chrome profile.
originYesLogin origin the human allowed, exactly like https://auth.example.com, with no path.
workOriginNoOptional work origin the human allowed for this site, such as https://www.example.com.

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does reasonably well: it discloses the 10-minute signal window, the refusal condition if the signal is missing, the constraint that workOrigin must belong to the same signal, and explicitly that it 'does not read cookies.' It doesn't say what is returned or whether the recorded origins are reversible.

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?

Four dense sentences, front-loaded with the core action and prerequisite, with no filler. Some phrasing is awkward (the embedded Korean label, 'terminal confirm command'), but every sentence carries a distinct constraint.

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?

For a state-recording tool with no annotations and no output schema, the description covers the prerequisite, the failure mode, the optional-param constraint, and one explicit non-behavior ('does not read cookies'). Return values aren't described, but that is a minor omission given the tool's narrow scope.

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?

Schema coverage is 100%, so baseline is 3, but the description adds genuine semantics beyond the schema: workOrigin must be part of the same human allow signal, tying an optional param to a runtime precondition the schema does not state.

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?

States a specific verb+resource: 'Record origins for one site' gated on a human allow signal. Clear enough to distinguish from read-oriented siblings, but it never names or contrasts auth_login/auth_open/auth_read/auth_act/auth_status, so differentiation is inferred rather than explicit.

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?

Gives a clear precondition (a human allow signal within the last 10 minutes) and a sequencing rule ('use this after the terminal confirm command'), and notes the 이 사이트 허용 button path already confirms origins. It does not explicitly route against specific sibling tools, so it falls short of a full when/when-not with alternatives.

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

auth_loginB

Open a visible Chrome window for one site id so a human can log in. Also opens a local tab that lists the login origin and work origin, then the button 이 사이트 허용. That button confirms those origins. Returns immediately. Does not type credentials or return the confirmation code.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesAbsolute http(s) URL of the login page the human will complete.
siteYesSite id: 1-64 characters of a-z, 0-9, underscore, or hyphen. Each site has its own Chrome profile.

TDQS

B3.3/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It does disclose key behaviors: opens a visible window (not headless), returns immediately (non-blocking), does not type credentials, does not return the confirmation code. However, it doesn't state what the return value is, whether the window persists, what happens on repeated calls for the same site, or any permissions/preconditions. It covers more than most, but leaves meaningful gaps for a mutation-style tool with no annotation coverage.

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

Conciseness3/5

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

The first sentence is front-loaded and clear, but the reference to a local tab and the Korean button label ('이 사이트 허용') is opaque without context and reads as implementation detail rather than agent-relevant guidance. The final sentence packs useful negatives but the middle is less efficient.

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 annotations and no output schema, the description should clarify return values and flow position. It states it returns immediately and does not return the confirmation code, but doesn't say what it does return, nor how it relates to the sibling confirmation/status tools. Adequate for a minimal flow step but incomplete for a multi-sibling login pipeline.

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?

Schema description coverage is 100%, so both the url and site parameters are fully documented in the schema, including the site id format and per-site Chrome profile behavior. The description adds no format, constraint, or semantic detail beyond what the schema already states, so the baseline of 3 applies.

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?

States a specific action (open a visible Chrome window) for a specific resource (one site id) with a human-in-the-loop purpose. It distinguishes from siblings by clarifying what it does NOT do (does not type credentials or return the confirmation code), which hints at the division of labor with auth_confirm/auth_act. The detail about the local tab listing origins and the 이 사이트 허용 button is somewhat idiosyncratic and could confuse without sibling context, but the core purpose is clear.

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 usage (this is the first step in a login flow, after which a human acts and a confirmation step presumably follows), but it never explicitly says when to call this versus auth_open, auth_confirm, or auth_act. The 'Returns immediately' note hints that it's non-blocking, which is useful, but the routing among siblings is left to inference.

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

auth_openA

Open a URL in that site's Chrome profile. The origin must already be human-confirmed for the site (login origin or a work origin). Re-resolves every A/AAAA and pins Chrome to one address from that checked set, then fails closed if the connected address is outside the set. Returns human_action_required and no page text when the page looks like a login or challenge, or when the final origin is not a confirmed login or work origin. Blocks subresource requests to link-local or metadata hosts.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesAbsolute http(s) URL on a confirmed origin for this site.
siteYesSite id: 1-64 characters of a-z, 0-9, underscore, or hyphen. Each site has its own Chrome profile.

TDQS

A4.1/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so well: it discloses DNS re-resolution with address pinning, fail-closed behavior when the connected address falls outside the checked set, the human_action_required return path with suppressed page text on login/challenge pages or unconfirmed final origins, and blocking of subresource requests to link-local/metadata hosts. These are exactly the non-obvious safety traits an agent needs.

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?

Four compact sentences, each carrying distinct information, with the core action and the origin precondition front-loaded. Density is high and there is little waste, though the middle sentences pack multiple clauses that slightly reduce scannability.

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?

For a security-sensitive tool with no annotations and no output schema, the description covers preconditions, failure modes, and the human_action_required return path well. It leaves the success return value implied rather than stated and does not explain how the opened page relates to subsequent auth_read/auth_act calls, a minor gap.

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?

Schema coverage is 100%, so both parameters (site, url) are already fully documented with formats and constraints. The description's phrase 'confirmed origin' loosely constrains the url parameter but adds no syntax or format detail beyond the schema. Baseline 3 is appropriate when the schema does the heavy lifting.

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 opens with a concrete verb and resource: 'Open a URL in that site's Chrome profile.' That is unambiguous about the action and the per-site Chrome profile scope. It does not explicitly contrast itself with siblings like auth_read or auth_act, so an agent must infer when opening differs from reading or acting.

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?

It states a hard precondition: the origin must already be human-confirmed (login origin or work origin), which tells the agent this tool must follow auth_confirm/auth_login rather than being a first step. It gives clear context but names no alternative sibling or exclusion, so routing between auth_open and auth_read/auth_act is not spelled out.

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

auth_readA
Read-only

Read visible text from this site's current page, or navigate first when url is set and its origin is human-confirmed for the site. Re-resolves DNS on every call. Refuses unconfirmed origins. Truncates long text. Never returns cookies or storage.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoOptional absolute http(s) URL on a confirmed origin for this site.
siteYesSite id: 1-64 characters of a-z, 0-9, underscore, or hyphen. Each site has its own Chrome profile.
selectorNoOptional Playwright selector whose visible text to read.

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the readOnlyHint annotation: DNS is re-resolved on every call, unconfirmed origins are refused, long text is truncated, and cookies/storage are never returned. These are exactly the operational facts an agent needs before invoking it.

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?

Five terse sentences, each carrying a distinct constraint (mode, DNS, origin refusal, truncation, non-return of secrets). The primary purpose is front-loaded and nothing is padding.

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?

With no output schema, the description partially covers return behavior (visible text only, truncated, no cookies/storage). The main remaining gap is what the response looks like structurally and how truncation is signaled, but the essential call-correctness information is present.

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?

Schema coverage is 100%, so all three parameters are already documented, including that url must be on a confirmed origin. The description restates the confirmed-origin constraint for url but adds nothing about selector, so it is on par with the schema rather than additive.

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?

States a specific verb and resource ('Read visible text from this site's current page') plus the conditional navigation mode when url is set. This is clearly distinguishable from auth_open, auth_act, and auth_status among the siblings.

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?

Explains the two modes of use (read current page vs. navigate-then-read when url is set) and the gating condition (origin must be human-confirmed). It does not explicitly contrast with auth_open/auth_act for navigation or reading after actions, so an agent must infer which sibling to prefer.

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

auth_statusA
Read-only

One line per site: site id, confirmed login and work origins, last used time, last confirmed time, session age, and session ok or needs_login. needs_login means the last open saw a login page. Age makes a stale ok visible. Returns no cookies, tokens, or URL query secrets.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoOptional site id. Omit to list every site.

TDQS

A3.5/5.0
Behavior4/5

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

With only readOnlyHint=true in annotations, the description adds real value: it explains that needs_login means the last open saw a login page, that age makes a stale 'ok' visible, and explicitly that no cookies, tokens, or URL query secrets are returned. That security/return-content disclosure goes well beyond the annotation, though it says nothing about refresh/polling cost or freshness guarantees.

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?

A single dense paragraph, front-loaded with the output shape before the semantic notes. Every clause carries information (field list, needs_login meaning, age rationale, no-secrets guarantee), though the field enumeration is somewhat list-heavy.

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?

With no output schema, the description correctly carries the return-format burden and does so thoroughly, and readOnlyHint covers the safety profile. It is complete enough to call correctly, with the only gap being guidance on when to prefer this over the sibling auth_* tools.

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?

Schema coverage is 100% and the single optional 'site' parameter is fully documented in the schema ('Omit to list every site'). The description adds no further syntax or format detail for the parameter, so the 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 conveys that this is a per-site auth status report by enumerating the fields returned ('site id, confirmed login and work origins, last used time, last confirmed time, session age, and session ok or needs_login'). It is clear what the resource is, but it is framed as an output listing rather than a verb+resource statement and never contrasts itself with siblings like auth_read or auth_confirm.

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 statement of when to use this tool versus the other auth_* tools (auth_login, auth_confirm, auth_open, auth_read, auth_act). The only scoping hint is implicit in the site listing behavior, which the schema already documents. No exclusions or preconditions are given.

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. 6 tool updatesv0.1.0
    • First observedauth_act
    • First observedauth_confirm
    • First observedauth_login
    • First observedauth_open
    • First observedauth_read
    • First observedauth_status

TDQS

A3.9/5.0

Scored across 6 tools

Disambiguation4/5

auth_login (human-driven login window) and auth_open (agent-driven navigation in a confirmed profile) both open Chrome, which could cause confusion, but their descriptions clearly delineate human login vs. agent browsing. auth_read and auth_act are cleanly separated by read vs. interaction, and auth_status is distinct.

Naming Consistency5/5

All six tools use the consistent auth_ verb_noun pattern (auth_login, auth_confirm, auth_open, auth_read, auth_act, auth_status). Names are predictable and map cleanly to actions.

Tool Count5/5

Six tools is well-scoped for an authenticated-browsing server: setup (login, confirm), operations (open, read, act), and introspection (status). Each tool earns its place with no redundancy.

Completeness4/5

The surface covers the full login-to-automation lifecycle including origin confirmation and status reporting, with sensible safety boundaries. Session teardown/logout or multi-step action batching are minor gaps an agent can work around.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to control the user's Chrome or Firefox browser, leveraging existing sessions for tasks requiring authentication and user handoff.
    18
    59 npm
    19
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI assistants and terminals to control a user's already logged-in Chrome session, allowing them to navigate pages, read content, click and type, run JavaScript, and inspect console or network activity.
    30
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants and terminal users to control a logged-in Chrome browser, performing actions like opening pages, searching, filling forms, and taking screenshots without re-authentication.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables agents to sign into websites through a real browser without exposing passwords, keeping cookies in a local Chrome profile and providing tools for browsing and managing authenticated sessions.
    5
    1
    MIT