# Nefesh — Real-Time Human State Awareness for AI

> Fuses biometric signals into a stress score (0-100) for AI adaptation. MCP + A2A native.

- name: ai.nefesh/human-state
- version: 4.0.0
- connection class: R0 (autonomous)
- trust: 82/100
- quality: 71/100 (needs work)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/ai.nefesh%2Fhuman-state
- tools: https://api.protogrid.dev/v1/servers/ai.nefesh%2Fhuman-state/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "human-state": {
      "type": "http",
      "url": "https://mcp.nefesh.ai/mcp",
      "headers": {
        "X-Nefesh-Key": "${X_NEFESH_KEY}"
      }
    }
  }
}
```

Placeholders to fill: `${X_NEFESH_KEY}`.

## Trust

- hygiene: 100
- liveness: 100
- freshness: 45
- provenance: 75
- drivers: +repository +dns-namespace +reachable +uptime-100% -stale-200d
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 71/100 (needs work)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 79 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- warn `tools.annotations`: only 1 of 7 tools declare readOnlyHint or destructiveHint
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: ingest (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); get_trigger_memory (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); get_session_history (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); …
- pass `tools.token_cost`: about 2,116 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 50 (weight 15)

- pass `stability.changes`: 5 tool changes in 30 days
- fail `stability.rug_pull`: 2 tools kept their name but changed most of their description in 30 days; review before trusting them

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 7, about 2,116 tokens to load them all
- tool set hash: 96797c858f02978bc11526bea1af023c
- tools last changed: 2026-10-02T06:10:13.771Z
- badge: [![protogrid quality](https://protogrid.dev/badge/ai.nefesh/human-state.svg)](https://protogrid.dev/servers/ai.nefesh/human-state)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-10-02 `check_api_key_status` changed (description, inputSchema) **meaning changed**
  - before: Check the status of a pending API key request. Use the exact same email the user provided to request_api_key. Poll this every 10 seconds. Once the user clicks the verification link in their inbox, status changes from 'pending' to 'ready' and the response includes the API key. Store it immediately — returned once only. Expires after 15 minutes.
  - after: Check a pending API key authorization using its request_id. Use request_id exactly as returned by request_api_key, never an email. Poll every 10 seconds. awaiting_user means the user must open the URL; pending means email verification is still required. ready returns the API key once only. Store it and include it in all subsequent HTTP calls. Stop on expired; ask the user before starting another authorization.
- 2026-10-02 `request_api_key` changed (description, inputSchema) **meaning changed**
  - before: Request a free Nefesh API key. No existing API key needed for this call. IMPORTANT: You MUST ask the user for their real email address before calling this tool. Do NOT invent, guess, or generate an email address. The user will receive a verification link they must click to activate the key. Without clicking that link, no API key will be issued. Disposable or temporary email services are blocked. Example prompt to the user: "What is your email address? You will receive a verification link to activate your free API key." Flow: call this with the user's real email, then poll check_api_key_status every 10 seconds until status is 'ready'. Free tier: 1,000 calls/month, all signal types, 10 req/min. No credit card.
  - after: Start free API key authorization; no existing API key needed. Returns a verification_url. Ask the user to open that URL in their browser, enter their own email, then open the verification email and confirm access for their agent. This tool does not accept email addresses and does not send email. Do not choose, invent, or submit an email on the user's behalf. Poll check_api_key_status with the returned request_id at the supplied interval. Stop if the request expires. Never create new requests in a loop.
- 2026-10-02 `delete_subject` added
  - Permanently delete all sessions and trigger memory for a subject. Irreversible. Only call when the user explicitly requests this deletion.
- 2026-10-02 `get_session_history` changed (inputSchema)
- 2026-10-02 `ingest` changed (inputSchema)

Full history: https://api.protogrid.dev/v1/servers/ai.nefesh%2Fhuman-state/changes

## Remotes

- https://mcp.nefesh.ai/mcp (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

_none_

## Tools (7)

- `check_api_key_status`: Check a pending API key authorization using its request_id.

    Use request_id exactly as returned by request_api_key, never an email.
    Poll every 10 seconds. awaiting_user means the user must open the URL;
    pending means email verification is still required. ready returns the
    API key once only. Store it and include it in all subsequent HTTP calls.
    Stop on expired; ask the user before starting another authorization.
    
- `delete_subject`: Permanently delete all sessions and trigger memory for a subject.

    Irreversible. Only call when the user explicitly requests this deletion.
    
- `get_human_state`: Get current unified human state for a session. Call this before generating important responses.

    Returns:
    - state: calm | relaxed | focused | stressed | acute_stress
    - stress_score: 0-100 (lower = calmer)
    - confidence: 0.0-1.0 (based on signal quality and device type)
    - suggested_action: maintain_engagement | simplify_and_focus | de-escalate_and_shorten | pause_and_ground
    - action_reason: human-readable explanation of why this action was suggested
    - adaptation_effectiveness (on 2nd+ call): shows whether your previous suggested_action actually reduced stress — contains previous_action, stress_delta, and effective boolean. Use this to self-improve.

    Use suggested_action to adapt your response: calm/relaxed = full complexity, focused = shorter and structured, stressed = max 2 sentences, acute_stress = one grounding sentence only.

    Requires a prior ingest call to have data. Not a medical device.
    
- `get_session_history`: Get state history for a session over time.

    Returns timestamped datapoints with stress_score, state, and heart_rate for each observation.
    Includes an overall trend: rising | falling | stable.

    Use minutes parameter to control the lookback window (default: 5, max: 60).
    Useful for detecting stress patterns during a conversation. Not a medical device.
    
- `get_trigger_memory`: Retrieve psychological trigger profile for a subject.

    Returns which conversation topics consistently cause stress (active triggers) and which have been resolved over time.

    - active triggers: topics where stress was elevated across multiple sessions. Tread carefully.
    - resolved triggers: topics where stress has decreased. Safe to explore deeper.

    Each trigger includes observation_count, avg_score, peak_score, and last_seen.

    Requires prior ingest calls with the same subject_id. Not a medical device.
    
- `ingest`: Send biometric signals from any sensor, get unified state back.

    Required: session_id + timestamp (ISO 8601) + at least one signal.
    Send whatever you have — the API fuses all signals into one state.

    Common signals (highest impact):
    - heart_rate (bpm, 30-220) + rmssd (ms) — cardiovascular
    - tone: calm | tense | anxious | hostile — vocal
    - sentiment: -1.0 to 1.0 — textual
    - expression: relaxed | neutral | tense — visual

    For trigger memory (cross-session psychological tracking):
    - Include subject_id (consistent per user, hashed)

    Returns same fields as get_human_state plus signals_received list and topics_detected (if conversation text was included).

    source_device is optional but improves confidence scoring. Not a medical device.
    
- `request_api_key`: Start free API key authorization; no existing API key needed.

    Returns a verification_url. Ask the user to open that URL in their
    browser, enter their own email, then open the verification email and
    confirm access for their agent. This tool
    does not accept email addresses and does not send email.
    Do not choose, invent, or submit an email on the user's behalf.
    Poll check_api_key_status with the returned request_id at the supplied
    interval. Stop if the request expires. Never create new requests in a loop.
    
