An OpenSearch 1.1 Description index template for Movable Type (served as opensearchdescription.xml):
<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
<ShortName><$MTBlogName remove_html="1" encode_xml="1" trim_to="16"$></ShortName>
<Description><$MTBlogDescription remove_html="1" encode_xml="1" trim_to="1024"$></Description>
<Contact>you@example.com</Contact>
<Url type="application/atom+xml" template="<$MTCGIPath$><$MTSearchScript$>?IncludeBlogs=<$MTBlogID$>&search={searchTerms}&Template=opensearch"/>
<Url type="text/html" template="<$MTCGIPath$><$MTSearchScript$>?IncludeBlogs=<$MTBlogID$>&search={searchTerms}"/>
<LongName><$MTBlogName remove_html="1" encode_xml="1"$></LongName>
<Image height="16" width="16" type="image/vnd.microsoft.icon"><$MTBlogURL$>favicon.ico</Image>
</OpenSearchDescription>
and an OpenSearch 1.1 Response search template for Movable Type (using extensions to Atom 1.0, saved as opensearch.tmpl and served by the normal search script):
<?xml version="1.0" encoding="<$MTPublishCharset$>"?>
<feed
xmlns="http://www.w3.org/2005/Atom"
xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/">
<MTSearchResults>
<MTBlogResultHeader>
<title><$MTBlogName remove_html="1" encode_xml="1"$>: search results for <$MTSearchString remove_html="1" encode_xml="1"$></title>
<id>tag:<$MTBlogHost exclude_port="1" encode_xml="1"$>,<$MTDate format="%Y"$>:<$MTBlogRelativeURL encode_xml="1"$>/<$MTBlogID$>/opensearch/<$MTSearchString remove_html="1" encode_xml="1"$></id>
<link rel="self" type="application/atom+xml" href="<$MTCGIPath$><$MTSearchScript$>?IncludeBlogs=<$MTBlogID$>&search=<$MTSearchString remove_html="1" encode_xml="1"$>&Template=opensearch"/>
<link rel="alternate" type="text/html" href="<$MTCGIPath$><$MTSearchScript$>?IncludeBlogs=<$MTBlogID$>&search=<$MTSearchString remove_html="1" encode_xml="1"$>" />
<author>
<name>Your Name</name>
<email>you@example.com</email>
</author>
<icon>http://<$MTBlogHost encode_xml="1"$>/favicon.ico</icon>
<updated><MTEntries lastn="1"><$MTEntryModifiedDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></MTEntries></updated>
<opensearch:Query role="request" searchTerms="<$MTSearchString remove_html="1" encode_xml="1"$>" />
<opensearch:totalResults><$MTSearchResultCount$></opensearch:totalResults>
<opensearch:startIndex>1</opensearch:startIndex>
<opensearch:itemsPerPage><$MTSearchResultCount$></opensearch:itemsPerPage>
<opensearch:link rel="search" href="<$MTBlogURL$>opensearchdescription.xml" type="application/opensearchdescription+xml"/>
</MTBlogResultHeader>
<entry>
<link rel="alternate" type="text/html" href="<$MTEntryPermalink encode_xml="1"$>"/>
<title><$MTEntryTitle remove_html="1" encode_xml="1"$></title>
<content type="text" xml:lang="<$MTBlogLanguage ietf="1"$>" xml:base="<$MTBlogURL encode_xml="1"$>"><$MTEntryExcerpt remove_html="1" encode_xml="1"$></content>
<id><$MTEntryAtomID$></id>
<published><$MTEntryDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></published>
<updated><$MTEntryModifiedDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></updated>
</entry>
</MTSearchResults>
</feed>
They're probably not perfect, but I think they should work, once A9 gets upgraded to parse the 1.1 description and response formats. I couldn't find a way to get the search script to return different content types for different templates, so the Atom is served as text/html. Also the entry type for the response is text, but MT encloses some entries in CDATA blocks, which seems to confuse the feed validator.
Updated 2005-12-13 to match the latest OpenSearch specifications.