Skip to main content
Glama
uniuninaruru

Listening Companion

by uniuninaruru

Listening Companion

Listening Companion は、SoundCloud アカウントに接続して、曲やプレイリストなどを読み取り専用で探したり、おすすめを出したりするためのローカル Python アプリです。

現時点では、1人で使うことを前提とした MVP(最小限の実用版)です。Codex プラグインとして動作し、依存ライブラリなしの MCP JSON-RPC stdio サーバーと、ローカルブラウザで結果を見るためのビューアーを備えています。

アプリ上の表示名は Listening Companion です。

内部では互換性維持のため soundcloud-recommender というパッケージ名・プラグイン名を使っていますが、これはユーザー向けの製品名ではありません。

現在できること

以下の機能を実装しています。

  • SoundCloud アカウントへの OAuth 2.1 認証

  • 最近再生した曲の取得

  • いいねした曲・プレイリストの取得

  • 自分のプレイリストの取得

  • フォロー中ユーザーや、そのユーザーの曲の取得

  • 曲・プレイリスト・ユーザーの検索

  • SoundCloud URL からリソースを取得

  • 曲・プレイリストの詳細取得

  • プレイリスト内の曲の取得

  • 関連楽曲の取得

  • ポッドキャストの簡易分類

  • ローカルルールによるおすすめ生成

  • 好みの保存・削除

  • 認証なしで試せるデモモード

OAuth 認証では、S256 PKCE、state の有効期限、リプレイ攻撃対策、リフレッシュトークンのローテーションなどを実装しています。

アクセストークンとリフレッシュトークンは、基本的にアプリを起動している間だけメモリ上に保持します。

切断またはアプリ終了時に削除されます。

トークンを平文ファイルへ保存する機能はなく、MCP ツールの結果としてトークンを返したり、ログへ出力したりすることもありません。

Related MCP server: SoundCloud MCP

SoundCloud API について

SoundCloud API へのアクセスは、許可したエンドポイントだけに限定しています。

また、API 通信は GET リクエストのみです。

主に以下を利用します。

  • /me

  • 最近再生した曲

  • いいね

  • プレイリスト

  • フォロー

  • 検索

  • /resolve

  • 曲・プレイリストなどの詳細

  • プレイリスト内の曲

  • 関連楽曲

SoundCloud 側へ書き込みを行う機能はありません。

ローカルビューアー

SoundCloud から取得した情報は、MCP を通してそのままモデルへ渡すのではなく、ローカルブラウザ上のビューアーで確認する仕組みになっています。

取得結果は、期限付きのインメモリキャッシュに一時的に保存されます。

SoundCloud から取得したコンテンツを SQLite やアーカイブへ保存することはありません。

ビューアーでは HTML エスケープを行い、SoundCloud へのリンクも表示して、適切に出典を確認できるようにしています。

おすすめ機能について

おすすめやポッドキャスト分類は、完全にローカルで動作するルールベース方式です。

以下の処理は行いません。

  • Embedding API の利用

  • AI モデルへの問い合わせ

  • 音声ファイルのダウンロード

  • ストリーム音声の保存

  • ファインチューニング

つまり、曲のメタデータをもとに、決められたルールで分類やランキングを行います。

好みの保存

必要であれば、SQLite に preference_profile を保存できます。

ただし、保存はユーザーが明示的に許可した場合のみです。

保存できるのは、例えば以下のような情報に限定されています。

  • 好きなジャンル

  • 興味のあるポッドキャストの話題

  • 言語

  • 好きなクリエイター

  • 避けたいキーワード

  • 好みの曲の長さ

  • 新しい曲をどれくらい積極的に探したいか

以下は保存しません。

  • 会話内容

  • AI のメモリ一覧

  • SoundCloud API の生レスポンス

  • 再生履歴そのもの

一時的に渡した好みは、save_preferencesconsent: true 付きで明示的に実行しない限り保存されません。

重要:SoundCloud のデータをモデルへ直接渡さない

ライブ環境では、MCP から返すデータを意図的に最小限にしています。

例えば以下のような結果だけを返します。

{
  "status": "ok",
  "result_id": "opaque-random-id",
  "count": 5,
  "viewer_url": "http://127.0.0.1:8765/view/opaque-random-id?token=opaque-capability",
  "expires_in_seconds": 600,
  "warnings": []
}

モデル側へ返されるのは、

  • 処理結果

  • 結果ID

  • 件数

  • ローカルビューアーのURL

  • 有効期限

  • 警告

など、Listening Companion 側で生成した情報だけです。

以下のような SoundCloud のデータは、ライブ環境ではモデル側へ直接渡しません。

  • 曲名

  • アーティスト名

  • 曲の説明

  • SoundCloud URL

  • SoundCloud API の生データ

これらは、ローカルビューアーを開いたユーザー本人だけが確認できます。

なお、デモモードでは仕組みを理解しやすくするため、架空のテストデータをそのまま返す場合があります。

セキュリティ上の注意

ローカルビューアーでは、

  • ランダムな capability token

  • 短時間だけ有効なインメモリデータ

  • HttpOnly Cookie

  • SameSite=Strict Cookie

などを使用しています。

デフォルトでは 127.0.0.1 のみに接続します。

このビューアーはあくまでローカル利用向けの簡易的な仕組みです。

本番環境向けの認証システムではありません。

そのため、LAN やインターネット上へ公開しないでください。

認証情報なしで試す

まずはデモモードで動作確認できます。

この README があるプラグインのルートディレクトリで実行してください。

python3 -m venv .venv
. .venv/bin/activate
python -m pip install -e ".[dev]"
python -m pytest
python scripts/validate_local.py
python scripts/run_mcp.py --demo

デモサーバーは stdout を使って MCP 通信を行います。

stdout へログを出さないため、そのまま MCP ホストへ接続できます。

通常は NDJSON(1行ごとに JSON を送る形式)を使用します。

Content-Length 形式が必要な MCP ホストでは、以下を指定してください。

--framing content-length

環境変数の設定

.env.example は設定例です。

Listening Companion 自体は .env ファイルを自動では読み込みません。

ローカルで実行する場合は、例えば次のようにします。

cp .env.example .env.local

.env.local の内容を編集したら、そのシェルへ読み込みます。

set -a
. ./.env.local
set +a
python scripts/run_mcp.py

.env.local は Git などへコミットしないようにしてください。

GUI アプリから MCP サーバーを起動する場合、そのアプリを起動した時点の環境変数が使われます。

そのため、認証情報を追加・変更した場合は、MCP ホストを再起動してください。

ホスト側が環境変数の再読み込みに対応している場合は、プラグインの再読み込みでも構いません。

実際の SoundCloud アカウントへ接続する

1. SoundCloud API アプリを登録する

現在の SoundCloud の開発者向け手順に従って、API アプリケーションを登録します。

現在の SoundCloud の案内では、API アプリ登録に Artist Pro が必要になる場合があります。

クライアントIDやセキュリティコードは必ず秘密にしてください。

プラグインのコードやチャットへ貼り付けないでください。

2. 環境変数を設定する

.env.example をコピーし、認証情報を設定します。

SOUNDCLOUD_SCOPE は、SoundCloud から利用可能な scope が明示されていない限り空のままにしてください。

Listening Companion 側で独自の scope を勝手に指定することはありません。

3. リダイレクトURIを登録する

LISTENING_COMPANION_REDIRECT_URI に指定した URI を、SoundCloud 側にも完全に同じ文字列で登録してください。

4. MCP サーバーを起動する

python scripts/run_mcp.py

デフォルトでは、

127.0.0.1:8765

でローカルビューアーが起動します。

その後、connect_account を実行します。

返された viewer_url をブラウザで開くと SoundCloud の認証画面へ移動し、認証完了後にローカルページへ戻ります。

5. MCP ツールを使う

接続後は、各種読み取り専用ツールを利用できます。

SoundCloud のデータを確認したい場合は、ツールの結果として返された viewer_url をブラウザで開いてください。

connect_account の結果が、

configuration_required

または

authorization_required

になることがあります。

これはエラーをごまかしているわけではありません。

有効な認証情報や認証操作がなければ、Listening Companion が勝手に SoundCloud アカウントへ接続することはありません。

利用できる MCP ツール

現在、以下のツールを提供しています。

connection_status
connect_account
disconnect_account
get_profile

recent_plays
liked_tracks
liked_playlists
my_playlists

followings
following_tracks

search_tracks
search_playlists
search_users

resolve_resource
get_track
get_playlist
playlist_tracks
related_tracks

classify_podcasts
recommend

get_preferences
save_preferences
delete_preferences

demo_catalog

API取得時の細かい仕様

一覧データには件数制限付きのページネーションを使用します。

最近再生した曲については、現在の SoundCloud API の仕様に合わせて最大25件まで取得します。

一般的なコレクションでは、

limit
linked_partitioning

を使用します。

フォロー中ユーザーの楽曲取得では、

limit
offset

を使用します。

SoundCloud API から返される next_href をそのまま信用することはありません。

接続先が許可された SoundCloud API ホストであることを検証した場合のみ、次のページへアクセスします。

/resolve が HTTP 302 リダイレクトを返した場合も、リダイレクト先を検証してからアクセスします。

関連楽曲は以下の API を使用します。

/tracks/{urn}/related

recommend では、複数の情報源をそれぞれ独立して取得します。

一部の情報源を取得できなかった場合でも、取得できた情報だけで結果を返し、警告を表示します。

テスト

以下のコマンドでテストできます。

python -m pytest
python scripts/validate_local.py
python <path-to-plugin-creator>/scripts/validate_plugin.py .

テストでは実際の SoundCloud API にはアクセスしません。

モック HTTP 通信と一時的なローカルストレージを使います。

主に以下を確認しています。

  • OAuth state の再利用防止

  • OAuth state の有効期限

  • PKCE

  • リフレッシュトークンのローテーション

  • 接続先の許可リスト

  • リダイレクト先の検証

  • API データの正規化

  • キャッシュの有効期限

  • 好み保存時の同意確認

  • おすすめランキングの再現性

  • ポッドキャスト分類

  • MCP のフレーミング

  • MCP スキーマエラー

  • SoundCloud データがモデル側へ漏れないこと

SoundCloud の利用規約について

このプロジェクトは、あくまで実装のための試作・雛形です。

このコードが存在するからといって、SoundCloud との正式な連携サービスとして運用する許可が得られるわけではありません。

現在の SoundCloud API Terms of Use では、API から取得したデータは User Content として扱われます。

また、以下のような制限があります。

  • User Content を AI 技術への入力として使用することへの制限

  • User Content を永続的にキャッシュすることへの制限

  • SoundCloud への帰属表示やリンクの要求

  • 個人情報を扱う場合のプライバシーポリシー要求

  • SoundCloud の商標をアプリ名として使うことの禁止

そのため Listening Companion では、できるだけ規約に配慮して以下の設計にしています。

  • おすすめ処理はローカルのルールベース方式

  • SoundCloud のデータは一時的なメモリ上だけに保持

  • SoundCloud のメタデータをモデルへ直接渡さない

  • SoundCloud の曲名やリンクはローカルビューアーでのみ表示

  • アプリ名には SoundCloud の名称を使わず Listening Companion とする

ただし、これだけで法的・契約上の問題がすべて解決するわけではありません。

実際に公開・運用する前には、最新の SoundCloud 利用規約を確認し、必要な権利処理を行う必要があります。

MCP プラグインとしての位置づけ

ローカル MCP の設定は、なるべく一般的で保守的な構成にしています。

.mcp.json では主に、

command
args
cwd
env
env_vars

を使用します。

ただし、以下についてはこのプロジェクトでは正式な動作保証をしていません。

  • MCP ホストごとのインストール方法

  • Python のパス設定

  • リモート HTTPS MCP の認証

また、このプロジェクトは ChatGPT Web へ直接接続するリモート MCP サービスではありません。

Web サイトをホスティングする機能もありません。

インターネット上で利用できる本番用 MCP サーバーにする場合は、別途以下が必要です。

  • サーバーのホスティング

  • ユーザー認証

  • データ保護・プライバシーの確認

  • SoundCloud 関連の権利確認

このリポジトリ単体では、外部へのデプロイは行いません。

ファイル構成

src/soundcloud_recommender/
  cache.py
    SoundCloudの取得結果やカーソルを一時保存するTTLキャッシュ

  classifier.py
    メタデータだけを使ったポッドキャスト判定

  cli.py
    ローカルCLIのエントリーポイント

  config.py
    環境変数や各種制限の設定

  http.py
    接続先を制限したHTTP通信処理

  mcp_stdio.py
    MCP JSON-RPC stdioサーバー本体

  models.py
    内部データモデルと公開結果モデル

  oauth.py
    PKCE、OAuth callback、トークン管理

  preferences.py
    ユーザーが許可した好みをSQLiteへ保存

  recommender.py
    ローカルで動作するおすすめランキング

  service.py
    各操作の実装と、モデルへ渡す情報の境界管理

  viewer.py
    ローカルブラウザで結果を見るためのビューアー

Available Tools

24 tools
classify_podcastsB
Read-onlyIdempotent

Classify a prior local result, or classify explicitly synthetic fixture items.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsNo
result_idNo
syntheticNo

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already clarify read-only, idempotent, non-destructive behavior, and the description does not contradict that. It adds a behavioral boundary: classification applies to 'prior local result' or 'synthetic fixture items' rather than arbitrary remote input. It does not go further to explain output, limits, or side effects, but the annotation coverage lowers the burden.

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?

The description is a single compact sentence that front-loads the verb and primary resource. Every word contributes to disambiguating the two mutually exclusive input modes. There is no redundant phrasing or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has a non-trivial anyOf schema, no output schema, and a very short description. The agent still cannot reliably decide what inputs to provide for 'items' or what classification result to expect. The description creates new concepts ('prior local result', 'fixture items') without defining them, leaving significant gaps for a tool that is not self-explanatory.

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?

With 0% schema description coverage, the description must carry meaning. It does map the two input modes to the parameters: 'prior local result' corresponds to result_id, and 'synthetic fixture items' correspond to items plus the synthetic flag. However, it does not describe the shape of objects in 'items', the type of 'result_id', or what makes an item 'synthetic', so the compensation is only partial.

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 uses a specific verb ('classify') and identifies both input modes: a prior local result or explicit synthetic fixture items. It distinguishes between these two legitimate use cases using 'or', and the name is not echoed. The term 'prior local result' is somewhat vague but the resource is clear enough for an agent to know this is for classification, not a sibling.

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 when to use the tool: when you have a prior local result (result_id) or synthetic items. However, it does not mention alternatives, exclusions, or prerequisites (e.g., what qualifies as a 'prior local result' or how to populate synthetic items). There is no competing classify tool among siblings, so the ambiguity is less severe, but explicit guidance is still missing.

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

connect_accountA

Create a short-lived local browser authorization receipt; never returns a token.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations provide no useful hints (all false), so the description must carry behavioral disclosure. It does disclose that the receipt is short-lived and that a token is never returned, which is valuable behavioral context. However, it does not mention potential side effects like requiring user interaction in the browser or whether the receipt is stored.

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?

The description is extremely concise, using a single sentence with two clauses. The primary action is front-loaded ('Create...'), followed by a critical behavioral note. No redundant words or filler.

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?

While the core function is clear, the description lacks essential context about the expected flow: it does not mention that browser interaction may be needed to complete authorization, how the receipt is used, or what the agent should expect as a follow-up. Given that there is no output schema and no annotations, the description could be more informative about the overall behavior.

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?

With zero parameters, the baseline is 4. The description successfully explains the tool's purpose without needing to elaborate on any input semantics. The empty schema needs no additional clarifications.

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?

The description clearly states a specific verb ('Create') and resource ('local browser authorization receipt'), and explicitly notes it never returns a token. This distinguishes it from sibling tools like connection_status or disconnect_account by focusing on the connection initiation action.

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?

No guidance on when to use this tool or when not to. It does not mention alternatives or provide context for choosing this over other account-related tools (e.g., disconnect_account). The description is purely declarative and leaves usage decisions to the agent.

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

connection_statusA
Read-onlyIdempotent

Return local connection state without provider metadata or tokens.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint, covering the safety profile. The description adds value by specifying that the returned state is local and excludes provider metadata or tokens, which clarifies what the response does and does not contain. This goes beyond the annotations and is useful context for an agent.

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?

The description is a single, tight sentence that front-loads the core purpose and scoping constraints. Every word earns its place with no fluff or repetition.

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 zero-parameter, read-only status tool, the description covers the main purpose and scope. However, it does not specify the exact return format (e.g., boolean or string) or any edge cases like whether it returns an error if no provider is connected. With no output schema, a slightly more explicit return description would make it fully complete.

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?

The tool has zero parameters, so the schema is fully covered (100%) with nothing to describe. The baseline for no parameters is 4, and the description adds no parameter details because none are needed. No deduction is warranted.

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?

The description clearly states a specific verb ('Return') and resource ('local connection state'), and adds distinguishing scope by excluding provider metadata or tokens. This differentiates it from sibling tools like connect_account and disconnect_account, which are about changing state rather than reporting 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?

The description implies this tool is for checking connection status, but it does not explicitly state when to use it versus alternatives (e.g., 'use this to verify connection before calling connect_account'). No exclusions or prerequisites are mentioned, leaving usage context to inference.

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

delete_preferencesA
DestructiveIdempotent

Delete the saved preference_profile.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and idempotentHint=true. The description adds no extra behavioral context beyond the annotation, such as whether deletion is permanent or if there is any confirmation. Given the annotations carry the safety profile, the description doesn't need to repeat it, but it also doesn't enrich it. This is adequate for a trivial operation.

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?

A single, short sentence with no filler. The description is appropriately brief for a parameterless tool. Every word contributes to the meaning, and it is front-loaded with the verb and object.

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 zero-parameter destructive operation, the description is complete. The annotation provides the destructive nature, and the description identifies the target. No return value is specified, but with no output schema, that is acceptable. It could mention that the action is irreversible, but the destructiveHint already covers that.

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?

The tool has zero parameters, and the input schema is empty. With 100% schema coverage and no parameters, the baseline is 4. The description doesn't need to explain parameters because there are none; this score reflects that the schema fully defines the interface.

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?

Clearly states the action (Delete) and the target resource (the saved preference_profile). This distinguishes it from siblings like get_preferences and save_preferences, which are read/write operations. The one-sentence description leaves no ambiguity about what the tool does.

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 the tool is to be used when the agent wants to remove the saved preference_profile, but it does not explicitly mention alternative tools or when-not-to-use cases. For a simple destructive operation, the lack of explicit exclusions is acceptable, but it could have clarified that this is the inverse of save_preferences.

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

demo_catalogA
Read-onlyIdempotent

Return synthetic fixture metadata for local testing; it never contacts SoundCloud.

ParametersJSON Schema
NameRequiredDescriptionDefault
content_typeNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety. The description adds the critical behavioral fact that it never contacts SoundCloud, which is not in the annotations and is essential for an agent to know it won't incur network costs or hit real data. It also clarifies the data is synthetic, which is useful context. This adds value beyond the structured metadata.

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?

The description is a single, compact sentence that front-loads the core purpose and the key behavioral constraint ('never contacts SoundCloud'). Every word earns its place; there is no fluff or redundancy. It is optimally sized for quick agent parsing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one optional enum parameter, no output schema, and strong annotations covering safety, the description is fully complete. It explains the purpose, the synthetic nature of data, and the no-network behavior. There is nothing an agent needs to correctly invoke this tool that is missing. The only minor gap is the parameter's effect, but the enum values are self-explanatory and the parameter is optional, so this does not undermine completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0%, and the tool description does not mention the content_type parameter at all. While the parameter is self-explanatory via its enum (music/podcast/mixed), the description does not clarify how this parameter affects the returned fixtures (e.g., whether it filters the fixture type). Since the schema lacks descriptions, the description should compensate, but it does not. This leaves the agent to infer the parameter's effect, a notable gap.

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?

The description states a specific verb ('return'), a resource ('synthetic fixture metadata'), and its purpose ('for local testing'). It explicitly distinguishes itself from real API calls by adding 'it never contacts SoundCloud,' which sets it apart from the many sibling tools that do interact with the API. This is a clear, unambiguous purpose.

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?

The description clearly indicates when to use this tool: for local testing, when you need synthetic data. It also implicitly signals when not to use it (when you need real data) by stating it never contacts SoundCloud. However, it does not explicitly name alternatives or provide explicit 'use this instead of X' guidance, so it misses the highest tier of explicit exclusion guidance.

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

disconnect_accountA
DestructiveIdempotent

Clear local tokens and all in-memory provider/result/cursor state.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds specificity about what is cleared (local tokens and in-memory state) and clarifies the scope is local, implying no server-side changes. This goes beyond the annotations and is useful for understanding side effects.

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?

The description is a single, well-structured sentence that conveys all necessary information with zero redundancy. It is front-loaded with the action and resource.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters, no output schema, and annotations already cover destructive and idempotent behavior, the description is fully complete for an agent to understand what the tool does and when to call it. No additional context is needed.

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?

With zero parameters, the baseline is 4. The description does not need to explain parameters, and the schema is empty. The description adequately conveys the tool's purpose without any parameter ambiguity.

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?

The description uses the specific verb 'Clear' and identifies the exact resources (local tokens and in-memory provider/result/cursor state), which clearly distinguishes this from siblings like connect_account and connection_status. The purpose is unambiguous.

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 for disconnecting an account but does not explicitly state when to use this versus alternatives like connection_status or connect_account. The context of siblings and the name make it fairly obvious, but there is no explicit when/when-not guidance.

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

followingsC
Read-onlyIdempotent

Fetch followed users into an expiring local viewer receipt.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
cursorNo

TDQS

C2.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds a behavioral hint about an 'expiring local viewer receipt,' but it is vague and does not clarify expiration semantics, return format, or pagination behavior. No contradiction with annotations is present.

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?

The description is a single sentence and leads with the primary action and resource, which is appropriately front-loaded. The cryptic 'expiring local viewer receipt' phrase reduces clarity but not size or organization; there is no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no parameter documentation, the description should explain what the tool returns and how to use limit/cursor. It does neither. The 'receipt' wording hints at a return artifact but not its structure, lifetime, or pagination behavior, leaving an agent under-informed for a straightforward list endpoint.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not mention limit or cursor at all. Since the schema provides only types and constraints—not semantic meaning—the description was supposed to compensate but does not. An agent gets no help understanding pagination or how these parameters interact.

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 core action and resource are clear: 'Fetch followed users.' This distinguishes it from sibling tools like following_tracks and liked_tracks. However, the appended phrase 'into an expiring local viewer receipt' is opaque and adds ambiguity to what the tool actually produces.

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?

No guidance is given about when to use this tool versus alternatives such as following_tracks, get_profile, or connection_status. There are no exclusions, prerequisites, or explicit routing hints. The intended context must be inferred entirely from the tool name and the one-line description.

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

following_tracksA
Read-onlyIdempotent

Fetch followed-user tracks with limit and offset; this endpoint does not use linked_partitioning.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare this as read-only, idempotent, and non-destructive, so the safety profile is covered. The description adds one useful behavioral detail: the endpoint does not use linked_partitioning, implying plain offset pagination. However, it does not disclose response shape or pagination defaults.

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?

The description is a single, front-loaded sentence with no filler. It communicates the action, the pagination parameters, and a meaningful technical caveat efficiently.

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?

The definition is adequate for basic invocation, especially with annotations covering safety and schema covering bounds. However, with no output schema and no sibling differentiation, an agent is left uncertain about the return format and when to prefer this over related tools.

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 description coverage is 0%, so the description must compensate. It names both limit and offset and clarifies that offset is a plain offset by noting the absence of linked_partitioning. The conventional parameter names plus schema constraints make the semantics reasonably clear.

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?

The description states a specific verb and resource: 'Fetch followed-user tracks', which clearly distinguishes this from sibling tools like followings, liked_tracks, and recent_plays. The mention of limit and offset further clarifies the operation's paginated scope.

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?

No guidance is provided about when to use this tool versus alternatives such as followings or liked_tracks. The linked_partitioning caveat is a technical behavior note, not a usage guideline.

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

get_playlistB
Read-onlyIdempotent

Fetch a playlist by numeric ID or canonical soundcloud:playlists:... reference.

ParametersJSON Schema
NameRequiredDescriptionDefault
referenceYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already establish that this is read-only, idempotent, and non-destructive, so the main safety behavior is covered. The description adds the accepted reference formats but does not disclose failure behavior, authentication requirements, or what the response contains. This is acceptable for a simple fetch but not rich behavioral context.

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?

The entire description is one concise sentence that front-loads the operation and then specifies the accepted input forms. No filler or redundant wording is present.

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?

The description is sufficient for a basic single-parameter read-only fetch, and the annotations cover idempotence and safety. However, there is no output schema, and the description does not indicate the response shape, error behavior, or how this tool relates to resolve_resource and get_track, leaving some contextual gaps for an agent.

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?

The schema provides no description for the 'reference' parameter, so the description carries the documentation burden. It successfully explains that the parameter accepts either a numeric ID or a canonical soundcloud:playlists:... reference, which is essential and not inferable from the schema alone. Some ambiguity remains around the exact canonical format.

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 clearly states the operation ('Fetch a playlist') and the target resource, and specifies the accepted reference kinds. It does not explicitly distinguish itself from sibling tools like get_track or resolve_resource, but the resource name makes the intended purpose easy to identify.

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?

The description gives no guidance about when to prefer get_playlist over alternatives such as resolve_resource, get_track, or playlist_tracks. It does not state exclusions or conditions, such as needing a numeric ID or canonical reference versus an arbitrary URL.

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

get_preferencesA
Read-onlyIdempotent

Read the explicitly saved minimal preference_profile only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is clear. The description adds useful context by specifying that it reads only the explicitly saved minimal preference_profile, implying no computed defaults or full-profile data are returned.

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?

A single, front-loaded sentence with no filler. Every word adds meaning, and the key scoping constraint ('only') is placed at the end for emphasis.

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 zero-parameter, read-only getter with no output schema, the description covers the essential scope. It could be slightly fuller by stating what happens when nothing has been explicitly saved, but the 'explicitly saved' phrasing implies that possibility.

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?

There are zero parameters and schema coverage is 100%, so the schema carries no burden. The baseline for 0 parameters is 4; the description correctly identifies what is being read without needing to explain parameters.

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?

The description uses a specific verb ('Read') and names the exact resource ('explicitly saved minimal preference_profile'). The word 'only' communicates scope and distinguishes this from the broader get_profile sibling, so an agent can tell them apart without opening schemas.

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?

No explicit when-to-use or alternatives are named, but the description implies this is for reading the saved minimal preference profile rather than other profile data. The 'only' scope gives some signal, but there is no direct comparison to get_profile or save_preferences.

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

get_profileB
Read-onlyIdempotent

Fetch the authenticated profile into an expiring local viewer receipt.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare read-only, idempotent, non-destructive behavior, so the description adds less critical context. It introduces an 'expiring local viewer receipt' detail hinting at ephemerality, but does not explain the expiration mechanism or consumption semantics. No contradiction with annotations.

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?

The description is a single compact sentence with no wasted words. The phrase 'expiring local viewer receipt' is conceptually dense but not verbose.

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 no-parameter read-only tool, the description is mostly sufficient. However, with no output schema, the unexplained 'viewer receipt' leaves uncertainty about what data the agent will receive, and it never clarifies whether an existing authenticated connection is required.

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?

The tool has zero parameters and an empty schema with 100% coverage, so the description has no parameter details to add. The baseline of 4 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 uses a specific verb ('Fetch') and identifies the resource ('authenticated profile'), which distinguishes it from sibling tools. However, the phrase 'into an expiring local viewer receipt' is opaque and may obscure the actual return value.

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?

No guidance is given about when to use get_profile versus alternatives such as connection_status or connect_account. An agent must infer applicability from the tool name alone.

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

get_trackA
Read-onlyIdempotent

Fetch a track by numeric ID or canonical soundcloud:tracks:... reference.

ParametersJSON Schema
NameRequiredDescriptionDefault
referenceYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds no behavioral context beyond the fetch operation itself, such as error handling or rate limits. It does not contradict annotations, but it also does not enrich them. Given the low bar set by strong annotations, a 3 is appropriate.

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?

A single, front-loaded sentence with no wasted words. It starts with the action, states the resource, and specifies the parameter format. This is exemplary conciseness.

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 simple fetch-by-reference tool with read-only annotations, the description covers the essential input format. It does not mention the return structure, but no output schema exists, and the tool name implies a track object. Given the low complexity and strong annotation coverage, the description is complete enough for correct invocation, though a note on error handling or not-found behavior would push it to 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only defines 'reference' as a string with length constraints, with 0% schema description coverage. The description compensates fully by explaining that the reference can be a numeric ID or a canonical soundcloud:tracks:... reference, giving the agent concrete guidance on what values to provide. This is exactly the kind of meaning the description should add.

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?

The description clearly states the verb 'Fetch', the resource 'track', and the two accepted forms of the reference parameter (numeric ID or canonical soundcloud:tracks:...). This is specific and distinguishes it from sibling tools like get_playlist, which fetches a playlist, and search_tracks, which searches. The purpose is unambiguous.

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?

No guidance is given on when to use this tool versus alternatives such as resolve_resource or search_tracks. It does not state when to prefer get_track over a search or a general resolver, nor does it mention any exclusions or prerequisites. The agent must infer usage from the description alone, which is insufficient.

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

liked_playlistsC
Read-onlyIdempotent

Fetch liked playlists into an expiring local viewer receipt.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
cursorNo

TDQS

C2.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the 'expiring local viewer receipt' notion, which hints at a non-obvious return behavior, but does not explain what the receipt contains, how it expires, or how the agent should handle it.

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 description is a single sentence with no filler, and the main verb/resource is front-loaded. However, the phrase 'expiring local viewer receipt' is jargon that obscures meaning rather than clarifying it, reducing the value of the conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with two optional pagination-related parameters and no output schema, the description is incomplete. It fails to explain cursor/limit semantics, the meaning of the receipt, or how this relates to sibling playlist tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not mention the limit or cursor parameters at all. The schema only provides basic constraints (min/max lengths, min/max values), so the agent gets no semantic guidance on pagination or how these parameters affect the result.

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 uses a specific verb and resource ('Fetch liked playlists'), making the core action clear. However, it does not differentiate from siblings like liked_tracks or my_playlists, and the phrase 'expiring local viewer receipt' is vague and unexplained.

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 guidance on when to use this tool versus alternatives such as my_playlists or liked_tracks. No context, prerequisites, or exclusions are provided, leaving the agent to infer the appropriate use case.

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

liked_tracksA
Read-onlyIdempotent

Fetch liked tracks into an expiring local viewer receipt.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
cursorNo

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond annotations: the result is an 'expiring local viewer receipt', which signals that the fetched data is not a persistent resource and may be temporary. This is useful and non-obvious.

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?

A single sentence that is concise and front-loaded with the core action ('Fetch liked tracks') followed by the key behavioral nuance ('expiring local viewer receipt'). No wasted words.

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 simple read-only paginated fetch with no output schema, the description is mostly adequate, but it does not mention pagination behavior or what the 'receipt' contains. The expiring-receipt concept is intriguing but under-specified; an agent may not know how to interpret the result or whether the cursor is needed for subsequent calls.

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 0%, so the description carries the burden, but it does not explain the limit or cursor parameters. However, the parameter names are self-explanatory (limit for pagination size, cursor for pagination token), and the schema provides constraints. The description adds no parameter-specific meaning, so a 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 uses a specific verb ('Fetch') and resource ('liked tracks'), and adds a distinctive outcome ('expiring local viewer receipt') that hints at a non-standard return. It is clear enough to distinguish from siblings like liked_playlists or recent_plays, though it does not explicitly name any sibling.

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 phrase 'expiring local viewer receipt' implies a temporary, viewer-scoped result, which gives some context for when to use it, but there is no explicit when-to-use guidance, no exclusions, and no mention of alternatives. The agent must infer usage from the description and sibling names.

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

my_playlistsC
Read-onlyIdempotent

Fetch the user's playlists into an expiring local viewer receipt.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
cursorNo

TDQS

C2.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, which cover the safety profile. The phrase 'expiring local viewer receipt' does attempt to add a behavioral trait beyond those annotations, but it is ambiguous about what actually expires and what 'receipt' means. It gives minimal extra transparency, not enough for a clear understanding.

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 sentence is short and front-loads the core verb and resource, which is structurally efficient. However, the 'expiring local viewer receipt' tail is confusing and does not earn its place, so the conciseness contributes to ambiguity rather than clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and 0% parameter schema coverage, the description carries the responsibility for explaining behavior and result semantics. It omits pagination meaning, return value/format, and any differentiation from the similar playlist-related siblings. Some context is provided by the annotations, but not enough for complete tool selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, so the description needs to compensate for the undocumented 'limit' and 'cursor' parameters. It does not mention either parameter at all, leaving their meaning, relationship to pagination, and defaults unresolved. This is a full gap in parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource ('the user's playlists') and a clear base action ('Fetch'), so the agent gets the gist. However, the qualifier 'into an expiring local viewer receipt' is opaque and does not explain what a 'viewer receipt' is or how this differs from the similarly named sibling liked_playlists. It is too jaggy to fully clarify intent.

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 guidance about when to use this tool versus alternatives like liked_playlists or playlist_tracks, which are present in the sibling list. The description only states what it does, not when or why it should be chosen. No exclusions, prerequisites, or context are provided.

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

playlist_tracksB
Read-onlyIdempotent

Fetch playlist tracks with bounded pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
cursorNo
referenceYes

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds bounded pagination, which is a useful behavioral trait—it tells the agent results are limited and a cursor is expected. This is credible context beyond the annotations, though not rich.

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?

A single front-loaded sentence with no filler. 'Fetch playlist tracks' states the core operation and 'bounded pagination' adjoins behavior in just six words. Nothing extraneous is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema and no per-parameter descriptions, so the description must supply return-shape and pagination context. It does not describe the cursor mechanism, the shape of a track, or how an agent should page through results, leaving a significant gap for a 3-parameter list endpoint.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, so the description carries the burden of explaining parameters. It hints that `reference` points to a playlist and that `limit`/`cursor` handle pagination, but it fails to explain how the cursor is obtained, what the reference format is, or what values control the result set beyond those hints.

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?

The description uses a specific verb ('Fetch') and resource ('playlist tracks'), plus the qualifier 'bounded pagination' that distinguishes it from plain list-fetching. An agent can clearly tell it apart from siblings like get_playlist or liked_tracks without opening the schema.

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?

The description simply states what the tool does and gives no guidance about when to choose it over siblings such as get_playlist, liked_tracks, or my_playlists. There are no alternative directions, exclusions, or usage conditions.

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

recent_playsA
Read-onlyIdempotent

Fetch only the current API's last-25 recently played tracks.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare the operation read-only, idempotent, and non-destructive, so the description's job is to add context beyond that. It adds the 'last-25' cap and 'current API' scope, which is helpful, but it does not clarify ordering, pagination, or what happens when fewer than 25 tracks exist. With annotations carrying the safety profile, a 3 is appropriate.

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?

A single sentence with no redundancy. It front-loads the key verb and scope, and every word adds meaning. This is an example of concise, effective copy.

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 parameterless, read-only tool, the description is sufficient for an agent to understand what it returns. It does not define edge cases like an empty history or whether playback ordering is chronological, but given the low complexity and simple sibling landscape, the missing detail is minor.

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?

There are zero parameters, so the schema already covers this exhaustively with 100% coverage. The baseline for 0 params is 4, and the description does not attempt to document any parameters because none exist, which is correct.

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 gives a specific verb (Fetch), resource (recently played tracks), and a concrete scope (last-25, current API), which clearly distinguishes this from sibling tools like liked_tracks or following_tracks. However, it does not explicitly name or contrast any sibling tool, so it misses the full 5.

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?

The tool description gives no guidance on when to choose this versus alternatives such as liked_tracks, following_tracks, or playlist_tracks. There is no mention of context, prerequisites, or exclusions, so the agent must infer usage from the name alone.

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

recommendB
Read-onlyIdempotent

Combine local history/likes/following/search signals into new deterministic recommendations.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
content_typeNo
preference_profileNo

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description does not contradict them. The description adds the determinism trait and the source-signal scope, but it does not disclose output format, defaults, personalization bounds, or other behavioral details such as pagination or rate limits. The annotation safety profile lowers the burden, making this adequate but not rich.

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?

The description is a single, concise sentence that front-loads the core action and scope. Every word contributes meaning, and there is no repetition of schema or annotation information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity—a nested preference_profile, multiple enums, zero parameter documentation, and no output schema—the description is insufficient. It does not explain what the returned recommendations look like, how the inputs affect results, or how this tool relates to nearby siblings. Some purpose is conveyed, but an agent would have to guess at critical details before invoking it confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for undocumented parameters. It does not mention limit, content_type, or preference_profile at all, and the nested preference_profile object with seven sub-properties is left entirely unexplained. The description adds no semantic value beyond the parameter names already present in the schema.

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 ('combine') and resource ('local history/likes/following/search signals') and clearly communicates that the output is recommendations. It is not a tautology, and the 'deterministic' qualifier adds useful scope. However, it does not explicitly differentiate itself from sibling tools like related_tracks or search_tracks.

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 when to use the tool: when you want recommendations derived from a combination of local history, likes, followings, and search signals. It provides no explicit when-not-to-use guidance, no mention of alternatives, and no conditions for choosing this over related_tracks or search_tracks.

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

resolve_resourceA
Read-onlyIdempotent

Resolve an HTTPS SoundCloud permalink through an allowlisted API redirect.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint, idempotentHint, and destructiveHint are all set, so the agent knows this is a safe, non-destructive operation. The description adds one important detail: that it works through an 'allowlisted API redirect', which implies there may be restrictions on which URLs are valid. However, it doesn't clarify what happens for non-allowlisted URLs or the exact redirect behavior. Given the annotations already cover safety, the description adds some value but not rich behavioral detail.

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?

The description is exactly one sentence, concise and front-loaded with the core action ('Resolve an HTTPS SoundCloud permalink'), followed by the mechanism ('through an allowlisted API redirect'). No fluff, every word earns its place. It is a model of brevity for a single-purpose tool.

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?

Given the simplicity of the tool (one parameter, no output schema), the description is reasonably complete for basic use: it tells the agent what input to provide. However, it lacks context on the return format (what the resolution returns) and any error conditions (e.g., invalid or non-allowlisted URLs). The tool's complexity is low, so the bar is lower, but a bit more detail on expected output or failure behavior would make it complete.

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 0%, meaning the schema gives no description for the 'url' parameter; the description must compensate. The description does state that the URL must be an HTTPS SoundCloud permalink, which adds semantics beyond the schema's generic 'uri' format. However, it doesn't specify any constraints like pattern or length beyond the schema's maxLength, so the added value is moderate. With 0% coverage, the description is partially compensatory, but it could be more explicit about what constitutes a valid permalink.

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 clearly states the action: resolving an HTTPS SoundCloud permalink, and specifies the mechanism (an allowlisted API redirect). It is specific about the input (an HTTPS URL from SoundCloud) and gives context about the permission. However, it does not explicitly differentiate from siblings; given that many sibling tools operate on specific resources like tracks, playlists, or users, this tool likely generalizes, but the description doesn't mention that explicitly.

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 the tool should be used to resolve SoundCloud permalinks before accessing specific resources like tracks or playlists, but it does not state when to use it versus alternatives or what happens after resolution. There's no mention of alternatives or exclusion conditions, leaving the agent to infer usage. The tool's role as a resolver is clear, but guidance on when to choose it over other tools (like get_track) is missing.

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

save_preferencesA
Idempotent

Save a minimal preference_profile only after explicit consent=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
consentYes
preference_profileYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already indicate idempotentHint=true and destructiveHint=false, so the description's 'save' is consistent with a non-destructive write. The description adds the requirement of explicit consent, which is a behavioral constraint not covered by annotations. However, it does not disclose whether the save overwrites existing preferences or merges them, nor does it describe error handling. It adds some context but not rich behavioral detail.

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?

The description is a single, front-loaded sentence with no unnecessary words. The key action and condition are stated immediately, making it highly efficient for an agent to parse and act on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a write operation with a nested object and no output schema, the description is too sparse. It does not explain whether the operation overwrites, merges, or upserts preferences, nor does it mention prerequisites like authentication. The consent condition is covered, but other essential behavioral aspects (e.g., what happens if consent is false, error scenarios) are omitted. An agent might incorrectly assume the tool handles partial updates or requires prior setup.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for lack of parameter documentation. It only mentions 'minimal preference_profile', which is vague and does not explain the fields or their semantics. The consent parameter is already constrained by the schema (const true), so the description adds little beyond that. It fails to clarify how the profile fields interact or what 'minimal' means in practice.

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?

The description states the exact action ('Save') and the resource ('preference_profile'), and includes a critical condition (consent=true). This clearly distinguishes it from sibling tools like get_preferences and delete_preferences, which are read and delete operations respectively. The purpose is unambiguous.

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 provides a clear condition for use ('only after explicit consent=true'), which is a usage constraint. However, it does not explicitly mention when not to use it or provide alternatives (e.g., using get_preferences to read). The context of siblings implies the tool is for writing, but explicit routing to alternatives is absent.

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

search_playlistsA
Read-onlyIdempotent

Search public playlists; live metadata stays in the local viewer.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
cursorNo

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds 'live metadata stays in the local viewer,' which hints at a behavioral nuance, but it is vague and does not meaningfully expand on pagination, result scope, or other runtime behavior.

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?

The first clause is concise and front-loaded: 'Search public playlists.' The second clause is compact but cryptic, slightly reducing clarity; the overall description is still appropriately short with no redundant filler.

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 simple search tool, the description is minimally viable: annotations cover safety and the schema covers parameter constraints. However, with no output schema and no explanation of return values or pagination behavior, the description leaves meaningful gaps for an agent choosing and invoking the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description does not explain any parameters. While names like query, limit, and cursor plus their constraints provide some clues, the description adds no semantic meaning beyond the input schema, so it fails to compensate for the coverage gap.

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?

The description states a specific verb, 'Search,' and a specific resource, 'public playlists,' which clearly distinguishes this tool from siblings like search_tracks and search_users. Even though the second clause is opaque, the core purpose is unambiguous.

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 phrase 'Search public playlists' gives a clear context for when the tool is relevant, but it provides no explicit when-not-to-use guidance or mention of alternatives. An agent must infer from sibling names that search_tracks or search_users cover other resource types.

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

search_tracksA
Read-onlyIdempotent

Search public tracks; live metadata stays in the local viewer.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
cursorNo

TDQS

A3.7/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows this is a safe read operation. The description adds the useful semantic that this searches *public* tracks (not the user's private library) and that 'live metadata stays in the local viewer' – indicating the returned data is a snapshot or local view, which is a genuine behavioral disclosure beyond the annotations. This clarifies the scope boundary between public and personal data.

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?

One sentence, zero unnecessary words alerted. The core scope ('public tracks') comes first就和 the behavioral caveat ('live metadata stays in the local viewer') follows. Every clause earns its place and the description trades compression against clarity optimally.

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 simple search tool with readOnly/idempotent annotations, the description is mostly adequate. However, the sibling set includes related_tracks, following_tracks, and get_track, and with zero description coverage for the parameters and no output schema, the description doesn't fully disambiguate use cases (e.g., when to use search_tracks vs related_tracks). The local viewer framing is helpful but leaves out how results are ordered or what a 'snapshot' means for the caller.

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 0%, but the parameters are straightforward: query (search text), limit (max results), cursor (pagination). The description doesn't elaborate on these beyond the schema, but the schema itself provides clear names, types, and constraints. The description adds a small amount of context ('public tracks') that constrains what the query parameter should target, which partially compensates for the lack of param-level documentation.

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 clear verb ('Search') and resource ('public tracks'), distinguishing it from sibling search tools like search_playlists and search_users. It lacks mention of what kinds of tracks (e.g., by title, artist) or any limiting scope beyond public, but the basic 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 phrase 'public tracks' provides some context, implying this searches only publicly available tracks rather than private or owned content. However, it doesn't explicitly explain when to use this tool versus siblings like get_track, following_tracks, or liked_tracks, nor does it mention alternatives or exclusions.

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

search_usersB
Read-onlyIdempotent

Search public users; live metadata stays in the local viewer.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
cursorNo

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructiveness, so the safety profile is clear. The description adds the note 'live metadata stays in the local viewer,' which provides some behavioral context but is vague and could confuse agents about what the returned data contains.

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?

The description is a single, efficient sentence with no wasted words. It front-loads the action and resource, making it easy to parse. However, it is so brief that it sacrifices essential detail for conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and 0% parameter description, the tool definition is incomplete. The cursor parameter (pagination) is not explained, and the return format is not described. The cryptic note about live metadata adds ambiguity rather than clarity, making it inadequate for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain any of the parameters (query, limit, cursor). The agent must rely solely on parameter names and constraints, which is insufficient for understanding how to construct an effective query or handle pagination.

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?

The description states a specific verb and resource ('Search public users') and clearly distinguishes this from sibling tools like search_tracks and search_playlists. The additional note about live metadata adds a distinct behavior, further clarifying intent.

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 this tool is for searching users, but it does not explicitly mention when to use it over alternatives like search_tracks or search_playlists. No guidance is given on conditions or exclusions, leaving the agent to infer usage from the name and context.

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. 24 tool updatesv0.1.0
    • First observedclassify_podcasts
    • First observedconnect_account
    • First observedconnection_status
    • First observeddelete_preferences
    • First observeddemo_catalog
    • First observeddisconnect_account
    • First observedfollowing_tracks
    • First observedfollowings
    • First observedget_playlist
    • First observedget_preferences
    • First observedget_profile
    • First observedget_track
    • First observedliked_playlists
    • First observedliked_tracks
    • First observedmy_playlists
    • First observedplaylist_tracks
    • First observedrecent_plays
    • First observedrecommend
    • First observedrelated_tracks
    • First observedresolve_resource
    • First observedsave_preferences
    • First observedsearch_playlists
    • First observedsearch_tracks
    • First observedsearch_users

TDQS

B3.3/5.0

Scored across 24 tools

Disambiguation5/5

Each tool maps to a distinct action or resource: auth, profile, play history, liked items, playlists, followings, search, track/playlist lookup, recommendations, preferences, and demo fixtures. Even similarly named tools like liked_tracks and following_tracks are clearly separated by their descriptions.

Naming Consistency3/5

The set mixes consistent verb_noun names like get_track and search_tracks with bare noun endpoints like recent_plays, liked_playlists, and demo_catalog. All names are readable snake_case, but the lack of a uniform verb prefix for fetch/list operations makes the pattern inconsistent.

Tool Count3/5

With 24 tools, the server sits in the heavy 16-25 range. Each tool has a specific purpose, but many are thin read-only retrievals that could be consolidated, so the count feels slightly excessive for the core companion scope.

Completeness4/5

The surface covers auth, profile data, listening history, likes, playlists, followings, search, track/playlist retrieval, recommendations, podcast classification, and preference CRUD. Minor gaps exist, such as no direct user-lookup or user-track endpoint, but agents can complete the main listening-companion workflows.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers