Atlas / MCP servers / tpsdev-ai / ๐ŸŽ–๏ธ Flair

๐ŸŽ–๏ธ FlairBLOCK

mcp/tpsdev-ai/flair

Identity, memory, and soul for AI agents. Runs standalone or as part of a TPS office.

Verdict
BLOCK
Grade
F
Trust score
38 /100
Exposed tools
8 7r ยท 1w ยท 0d
Transport
stdio ยท streamable-http
License
NOASSERTION
Stars
8
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://github.com/tpsdev-ai/flair/actions/workflows/test.yml) [](https://github.com/tpsdev-ai/flair/actions/workflows/docker-test.yml) [](https://opensource.org/licenses/Apache-2.0)

The identity and memory substrate for AI agents. Crypto-pinned. Federated. Self-hosted.

Every agent framework gives you chat history. None give you identity. Flair gives an agent three things that survive a restart and follow it between orchestrators: an identity it proves with an Ed25519 keypair, memory it searches by meaning rather than by keyword, and a soul โ€” the personality, values and procedures that make it that agent.

Quick start

Runs on a laptop, a VPS, or anywhere Node does. Needs Node.js 22+.

# 1. Install the CLI (no sudo)
npm install -g @tpsdev-ai/flair

# 2. Verify the command is on your PATH
flair --version

# 3. Bootstrap the instance and register an agent
flair init --agent mybot

# 4. Write a memory
flair memory add --agent mybot "Harper v5 sandbox blocks node:module but process.dlopen works"

# 5. Find it back by meaning, not by keyword
flair search --agent mybot "native addon loading in sandboxed runtimes"

If flair --version prints command not found, your npm global bin directory is not on PATH:

export PATH="$(npm prefix -g)/bin:$PATH"

Re-run flair --version to confirm, then continue.

Step 5 finds the memory you never keyword-matched:

Harper v5 sandbox blocks node:module but process.dlopen works
( 2026-07-28 ยท standard ยท 100% )

By default, that percentage displays semantic similarity with a small keyword-match boost. Hybrid search combines semantic and lexical ranks to order results, so the first result need not have the hi

Read from source at commit 476ceb40520eOBSERVED ยท 2026-10-11
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source โ€” not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add inproc-app --env AUTHENTICATION_AUTHORIZELOCAL=${AUTHENTICATION_AUTHORIZELOCAL} --env CONCIERGE_KEYFILE=${CONCIERGE_KEYFILE} --env CURSOR_API_KEY=${CURSOR_API_KEY} --env FABRIC_PASSWORD=${FABRIC_PASSWORD} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "inproc-app": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "AUTHENTICATION_AUTHORIZELOCAL": "${AUTHENTICATION_AUTHORIZELOCAL}",
        "CONCIERGE_KEYFILE": "${CONCIERGE_KEYFILE}",
        "CURSOR_API_KEY": "${CURSOR_API_KEY}",
        "FABRIC_PASSWORD": "${FABRIC_PASSWORD}"
      }
    }
  }
}
03

Exposed tools (8)

7 read ยท 1 write ยท 0 destructive.

ToolRiskDescription
areadfirst
breadsecond
brand_new_toolreadphantom
flair_get_by_subjectreadGet memories about subject
flair_searchreadSearch Flair memory by semantic similarity. Returns memories ranked by relevance to the query.
resize-imagewriteResize before upload
resize-image-privatereadPrivate resize procedure
rotate-videoreadRotate a video clip
04

Trust audit

BLOCKgrade F ยท trust 38/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
declared (5 observation(s))
Shell
declared (7 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

CRITICALHard-coded secrets ยท secret.private_key ยท CWE-798, CWE-321
packages/adk-flair-js/src/signing.ts:49
*   - PEM (`-----BEGIN PRIVATE KEY-----`)
CRITICALHard-coded secrets ยท secret.private_key ยท CWE-798, CWE-321
packages/adk-flair/src/adk_flair/memory_service.py:302
- PEM (``-----BEGIN PRIVATE KEY-----``)
CRITICALHard-coded secrets ยท secret.private_key ยท CWE-798, CWE-321
packages/pi-flair/src/index.ts:68
/-----BEGIN PRIVATE KEY-----/u,         // Private keys
HIGHCode injection ยท code.deserialize ยท CWE-78, CWE-94, CWE-95
src/bridges/runtime/formats.ts:197
const parsed = yaml.load(fmText);
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection ยท code.deserialize ยท CWE-78, CWE-94, CWE-95
src/bridges/runtime/yaml-loader.ts:113
parsed = yaml.load(raw);
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection ยท code.deserialize ยท CWE-78, CWE-94, CWE-95
src/lib/mcp-enable.ts:617
doc = yaml.load(raw);
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection ยท code.deserialize ยท CWE-78, CWE-94, CWE-95
src/lib/mcp-enable.ts:690
doc = yaml.load(raw);
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection ยท code.deserialize ยท CWE-78, CWE-94, CWE-95
src/lib/mcp-enable.ts:984
return yaml.load(text);
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection ยท code.eval_exec ยท CWE-78, CWE-94, CWE-95
packages/n8n-nodes-flair/src/client.ts:22
(new Function("return import('@tpsdev-ai/flair-client')") as () => Promise<any>)();
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection ยท code.eval_exec ยท CWE-78, CWE-94, CWE-95
src/cli.ts:2528
return parseListeningPids(exec(`lsof -ti :${port} -sTCP:LISTEN`), process.pid);
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
MEDIUMInformation disclosure ยท disclose.log_secret ยท CWE-209, CWE-532
src/commands/deploy.ts:47
console.log(dim(`  1. Set an admin password in Fabric Studio (Cluster Settings โ†’ Admin)`));
MEDIUMInformation disclosure ยท disclose.log_secret ยท CWE-209, CWE-532
src/commands/deploy.ts:48
console.log(dim(`  2. Save that password in an owner-only file (chmod 600), then seed your first agent:`));
MEDIUMInformation disclosure ยท disclose.log_secret ยท CWE-209, CWE-532
src/commands/federation.ts:1724
console.log(token);
MEDIUMNetwork egress ยท net.beacon_words ยท CWE-200, CWE-319
resources/content-safety.ts:39
[/output\s+(all|every|the)\s+(secret|api\s*key|password|token|credential)/i, "exfiltration"],
MEDIUMNetwork egress ยท net.beacon_words ยท CWE-200, CWE-319
resources/content-safety.ts:40
[/reveal\s+(your|the|all)\s+(system\s+)?prompt/i, "exfiltration"],
MEDIUMObfuscation / stealth ยท obf.zero_width ยท CWE-506, CWE-94
resources/scan/skill-scanner.ts:87
{ regex: /[-]/, type: "zero_width_char" },
MEDIUMHard-coded secrets ยท secret.generic ยท CWE-798, CWE-321
packages/flair-mcp/test/capture.test.ts:261
const secret = label === "a ghp_ token" ? SECRET : "abcdefghijklmnopqrstuvwx123";
MEDIUMHard-coded secrets ยท secret.generic ยท CWE-798, CWE-321
test/integration/init-persisted-admin-harper5.test.ts:146
const password = "fixture-fresh-explicit-password";
MEDIUMHard-coded secrets ยท secret.generic ยท CWE-798, CWE-321
test/unit-isolated/federation-pair-response.test.ts:119
const token = "pair-token-complete-identity";
MEDIUMHard-coded secrets ยท secret.generic ยท CWE-798, CWE-321
test/unit-isolated/federation-pair-response.test.ts:139
const token = "pair-token-no-hub-instance";
MEDIUMHard-coded secrets ยท secret.generic ยท CWE-798, CWE-321
test/unit-isolated/federation-pair-response.test.ts:249
const token = "pair-token-unnameable-row";
MEDIUMHard-coded secrets ยท secret.private_key ยท CWE-798, CWE-321
packages/n8n-nodes-flair/test/sign-as-agent.test.ts:347
agentPrivateKey: "-----BEGIN PRIVATE KEY-----\nAAAA\n-----END PRIVATE KEY-----",
MEDIUMHard-coded secrets ยท secret.private_key ยท CWE-798, CWE-321
packages/pi-flair/README.md:108
- Private keys (`-----BEGIN PRIVATE KEY-----`, `-----BEGIN RSA PRIVATE KEY-----`)
LOWInventory / provenance ยท inv.suspicious_name ยท CWE-1104
test/bench/longmemeval/payload-ab.ts
payload-ab.ts
Why it matters. member named after an attack tool
Fix. remove or justify
LOWInventory / provenance ยท inv.suspicious_name ยท CWE-1104
test/bench/longmemeval/results/payload-ab-artifact-dede855fae8efe60.json
payload-ab-artifact-dede855fae8efe60.json
Why it matters. member named after an attack tool
Fix. remove or justify

Gates applied: critical_finding, no_behavioural_pass.

Audited 2026-10-11 ยท audit v0.4.1 ยท source sha 476ceb40520efull audit observations/trust-audit/mcp-server/tpsdev-ai__flair.json ยท Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-11476ceb40520eBLOCKF38first audit
06

Questions

What is the @tpsdev-ai/flair-mcp MCP server?

Identity, memory, and soul for AI agents. Runs standalone or as part of a TPS office.

What tools does @tpsdev-ai/flair-mcp expose?

8 in total: 7 read-only, 1 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is @tpsdev-ai/flair-mcp safe to connect to an agent?

No โ€” not without reading the findings first. The audit graded it F (38/100) and found 10 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does @tpsdev-ai/flair-mcp need?

It reads AUTHENTICATION_AUTHORIZELOCAL, CONCIERGE_KEYFILE, CURSOR_API_KEY, FABRIC_PASSWORD, FABRIC_TOKEN, FLAIR_ADMIN_PASS, FLAIR_ADMIN_PASSWORD, FLAIR_ADMIN_TOKEN, FLAIR_AGENT_AUTH_WINDOW_MS, FLAIR_CLUSTER_ADMIN_PASS, FLAIR_KEYFILE and FLAIR_KEY_DIR from the environment. Give it a token scoped to the least it needs โ€” an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does @tpsdev-ai/flair-mcp run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as inproc-app at 0.0.0.

How current is this page?

The grade is for one exact copy of the source (476ceb40520e), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement