Allow setting the server `instructions` returned at the initialize handshake
### Problem
There's currently no way to populate the MCP `instructions` field. The protocol
lets a server hand the client a short "here's how to use me" string in its
`initialize` response, and the SDK already supports it
(`Mcp\Server\Builder::setInstructions()`) — but `McpServerFactory` never calls
it, and there's no config key or hook to supply a value. So the plumbing is
sitting there one method call away, and nothing can actually reach it.
It's worth wiring up because that field is the most direct place to tell an
agent something at connect time (e.g. "use this server's tools before doing X").
It goes to every client on initialize, it's client-agnostic, and it needs no
file or out-of-band setup. Right now that channel is just dark.
### Proposed resolution
Keep it small and additive:
- Add an optional `server_instructions` setting, empty by default.
- Add `hook_mcp_server_instructions_alter()` so a module can set or refine the
value in code rather than only through config.
- Have the factory read the setting, run it through the alter hook, and pass the
result to `setInstructions()`. Empty or whitespace-only normalizes to `NULL`
so the field is simply omitted — meaning default output is byte-for-byte what
it is today, and nobody who isn't using this notices a thing.
No update hooks / no BC concerns, per the "still pre-release, no migrations" rule.
### Status
I've got a branch ready with the change plus a kernel test covering the three
paths (configured value passes through, empty/whitespace is omitted, and the
alter hook can set/override/clear it). Also confirmed over STDIO that the
`instructions` field shows up in the handshake when set and is absent when not.
Will open the MR against `2.x`.
issue